マイクロコントローラ用のライブラリをいくつか書いています。そのために、私はマクロのような機能を使います。例えば、I2Cモジュールを有効にするマクロのような機能が定義されているとして:_x
モジュール番号であるを使ったマクロ定数の連結##
#define I2C_MODULE_ENABLE(_x) \
I2C##_x##CONLbits.I2CEN = 1
(例えば、1
又は2
私の場合)。
ユーザーがI2C_MODULE_ENABLE(1)
というマクロのような関数を呼び出すと、プリプロセッサーによってI2C1CONLbits. I2CEN = 1
に展開されます。しかし
、ユーザは、(例えば、マクロ定数が#define MY_I2C 1
のように定義される)MY_I2C
は私i2c.h
ライブラリに含まれるユーザ定義config.h
ファイルで定義されたマクロ定数であるI2C_MODULE_ENABLE(MY_I2C)
、このマクロのような関数を呼び出す場合マクロ的な機能はI2CMY_I2CCONLbits. I2CEN = 1
として拡張されます。
は私が何とか連結前MY_I2C
マクロ定数を評価する必要があることを知っている、と私は別のマクロレベル追加していることを行うことができます。
#define __I2CxCONLbits(_x) I2C##_x##CONLbits
#define I2C_MODULE_ENABLE(_x) \
__I2CxCONLbits.I2CEN = 1
私の質問は次のとおりです。をよりエレガントな解決策はこれにあり私がCONLbits
レジスタのような複数のレジスタを持っているので、問題。このアプローチを使用すると、すべてのレジスタに特別な__I2CxREGISTER(_x)
マクロを定義する必要があります。
私はこのような何かしようとした:
#define __I2Cx(_x) I2C##_x
#define I2C_MODULE_ENABLE(_x) \
__I2Cx(_x)##CONLbits.I2CEN = 1
をそれは、このような出力を生成します:I2C1 CONLbits .I2CEN = 1
、そして私のコンパイラはI2C1
とCONLbits
トークンの間に空白文句を言っています。
これは実際に問題を解決していない/質問に答えます。 – melpomene
@melpomene - 私は結局そこに着いた。私のお気に入りのクラウドコンパイラでコードサンプルを確認するのに問題があった:) – StoryTeller
それはまだ 'CONLbits'を使うためにハードコードされています。 – melpomene