不。预处理发生在甚至编译代码之前。它存在于与执行程序完全不同的宇宙中。您可以做的一件事是只运行预处理步骤并检查输出(使用 gcc 开关-E
打印预处理器输出)。
您最多可以做的是将其重定向到一个文件,然后在程序中读取该文件。
进一步考虑,让我从“不”退后,将其改为“也许”。看看我的另一个答案,它为可变参数宏实现了一个“foreach”宏。
因此,使用APPLYXn
(并且,隐式地,PPNARG
),您可以STR(x) #x
像这样将宏应用于 args(nb 写成,APPLYXn
最多可以处理 15 个参数):
#define X(x) #x
#define ERROR_MESSAGE(priority, fmt, ...) \
"do {MODULE_LOG(" X(priority) X(fmt) APPLYXn(__VA_ARGS__) ");} while(0)"
int main() {
printf("%s\n", ERROR_MESSAGE(3, "%d", 5) );
return 0;
}
gcc -E
生产
# 1 "strvar.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "strvar.c"
# 71 "strvar.c"
int main() {
printf("%s\n", "do {MODULE_LOG(" "3" "\"%d\"" "5" ");} while(0)" );
return 0;
}
编译器会将所有这些字符串文字连接成一个字符串。