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,这不是我想要的.这里有什么帮助?或者我正在尝试做什么不可能?
是不可能的.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)
我留给你让它不像它在这里那样丑陋或黑客(更一般,取决于你需要的东西):)
...或者只是让 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)
归档时间: |
|
查看次数: |
11310 次 |
最近记录: |