可以将代码字符串传递到c++宏中吗?

Can one pass a code string into a CC++-macro?

本文关键字:c++ 代码 字符串      更新时间:2023-10-16

例如,我想做一个调试宏,在尝试执行之前打印一个代码字符串。我想应该是这样的

#define TRACE(string) printf("Trying to execute: %sn","string"); 
                      string
...
void foo() {
  printf("1n");
}
void bar() {
  printf("2n");
}
int main() {
  ...
  foo();
  TRACE(bar(););
  ...
}

期望输出

...
1
Trying to execute: bar();
2
...

好吧,这不是一个人怎么做的:编译器抱怨非法语法。有办法做到这一点吗?

您需要使用#:

使用stringification
#define TRACE(string) printf("Trying to execute: %sn",#string); 
                      string

完整例子:

#include <stdio.h>
#define TRACE(string) printf("Trying to execute: %sn",#string); 
                          string
void foo() {
  printf("1n");
}
void bar() {
  printf("2n");
}
int main() {
  foo();
  TRACE(bar(););
}
输出:

1
Trying to execute: bar();
2

ideone的实例

必须使用"stringification"运算符#,这将导致"string"的替换。

#define TRACE(string) printf("Trying to execute: %sn", #string); 
                      string

除了前面的答案之外,还可以将宏包装在do { /* ... */ } while(0)结构周围,如:

#define TRACE(string) do { 
                          printf("Trying to execute: %sn", #string); 
                          string 
                      } while(0)

否则可能导致错误,例如

if(condition)
    TRACE(foo();)

如果您没有将其包装在do { /* ... */ } while(0)结构中,即使condition为假,foo()也将被调用。如果后面有else语句,它甚至会导致语法错误。

有关更多信息,请参见为什么在宏中使用明显无意义的do-while和if-else语句?