C宏令牌连接涉及变量 - 是否可能?

gat*_*ere 8 c concatenation token stringification c-preprocessor

我正在尝试定义一个宏来生成一个包含变量的令牌名称.

基本上,我正在尝试的是:

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

int main() {
  int port;
  port = 2;
  PxDIR(port) |= 0x01;
}
Run Code Online (Sandbox Code Playgroud)

我希望在上面的语句中生成令牌P2DIR,但根据我的编译器输出,它生成令牌PportDIR,这不是我想要的.这里有什么帮助?或者我正在尝试做什么不可能?

Hit*_*esh 9

我不认为你想做的事情是可能的.C宏实际上是在编译之前扩展的预处理器宏.变量port,直到运行时才会设置.


det*_*tly 6

是不可能的.C预处理器通过处理令牌来工作,并且它们不进行任何需要知道语言机制的解决方案或替换(除了涉及整数文字的基本算术,在我的脑海之外).例如,考虑GCC 关于标记化的预处理器的文档.只有编译器才知道如何处理变量"port".

一种解决方案是执行以下操作:

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

...然后...

int port;
PxDIR(port, 2);
Run Code Online (Sandbox Code Playgroud)

我留给你让它不像它在这里那样丑陋或黑客(更一般,取决于你需要的东西):)


Agn*_*kas 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;
}
Run Code Online (Sandbox Code Playgroud)