可以将代码字符串传递到c++宏中吗?
Can one pass a code string into a CC++-macro?
例如,我想做一个调试宏,在尝试执行之前打印一个代码字符串。我想应该是这样的
#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
...
好吧,这不是一个人怎么做的:编译器抱怨非法语法。有办法做到这一点吗?
您需要使用#
:
#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语句?
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值