C++ 可以将代码字符串传递到C\C++-宏?
例如,我想制作一个调试宏,在尝试执行之前打印一个代码字符串。我想应该是这样的C++ 可以将代码字符串传递到C\C++-宏?,c++,c,macros,C++,C,Macros,例如,我想制作一个调试宏,在尝试执行之前打印一个代码字符串。我想应该是这样的 #define TRACE(string) printf("Trying to execute: %s\n",\"string\"); \ string ... void foo() { printf("1\n"); } void bar() { printf("2\n"); } int main() { ... foo(); TRACE(bar()
#define TRACE(string) printf("Trying to execute: %s\n",\"string\"); \
string
...
void foo() {
printf("1\n");
}
void bar() {
printf("2\n");
}
int main() {
...
foo();
TRACE(bar(););
...
}
预期产量
...
1
Trying to execute: bar();
2
...
好吧,这不是一个人怎么做的:编译器抱怨非法语法。有没有办法做到这一点呢?您需要使用
#
进行字符串化:
完整示例:
#include <stdio.h>
#define TRACE(string) printf("Trying to execute: %s\n",#string); \
string
void foo() {
printf("1\n");
}
void bar() {
printf("2\n");
}
int main() {
foo();
TRACE(bar(););
}
1
Trying to execute: bar();
2
必须使用“字符串化”运算符,#
,这将导致替换为“string”
除了前面的答案之外,将宏包装在
do{/*…*/}while(0)
构造中,如中所示:
#define TRACE(string) do { \
printf("Trying to execute: %s\n", #string); \
string \
} while(0)
否则,可能会导致错误,例如
if(condition)
TRACE(foo();)
如果在(0)construct时不将其环绕在do{/*…*/}上,则即使条件
为false,也会调用foo()
。如果后面有else
语句,它甚至会导致语法错误
有关更多信息,请参阅。C不支持类似的字符串。研究一个字符数组,你会在答案中找到答案。。。需要。
但是,最后一个分号将导致bar()代码>如果您的用例正在调试。我建议你试试GDB
#define TRACE(string) do { \
printf("Trying to execute: %s\n", #string); \
string \
} while(0)
if(condition)
TRACE(foo();)