9

変数を含むトークン名を生成するマクロを定義しようとしています。

基本的に、私がしようとしているのはこれです:

#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)

int main() {
  int port;
  port = 2;
  PxDIR(port) |= 0x01;
}

上記のステートメントでトークン P2DIR を生成したいと考えていますが、コンパイラの出力によると、トークン PportDIR が生成されていますが、これは私が望んでいたものではありません。ここで何か助けはありますか?それとも私がやろうとしていることは不可能ですか?

4

4 に答える 4

9

あなたがやろうとしていることは不可能だと思います。C マクロは、実際にはコンパイル前に展開されるプリプロセッサ マクロです。変数portは、実行時まで設定されません。

于 2010-09-03T04:27:26.273 に答える
6

それは無理だ。C プリプロセッサはトークンを処理することで機能し、言語の仕組みに関する知識を必要とするような解決や置換は行いません (整数リテラルを含む基本的な算術演算を除く)。たとえば、トークン化に関するGCC のプリプロセッサのドキュメントを考えてみましょう。変数「ポート」の処理方法を知っているのはコンパイラだけです。

1つの解決策は、次のようなことです。

#define PxDIR(var, portnum) do { \
    var = portnum; \
    P##portnum##DIR |= blah; \
} while(0)

...以降...

int port;
PxDIR(port, 2);

これをここにあるほど醜く、またはハックにしないようにすることはあなたに任せます(そして、必要なものに応じて、より一般的です):)

于 2010-09-03T04:32:12.863 に答える
5

...または単にPORTもマクロにします:

#define PORT 2
#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)

int main() {
    PxDIR(PORT) |= 0x01;
    return 0;
}
于 2010-09-06T08:08:59.970 に答える