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();)