c - 是否可以对可变参数宏进行字符串化?

标签 c macros

gcc (GCC) 4.7.2
c89

是否可以对可变参数宏进行字符串化?

我有以下宏,我想从 fmt 和参数输出结果字符串。

#define ERROR_MESSAGE(priority, fmt, ...)        \
    do {                                         \
        MODULE_LOG(priority, fmt, ##__VA_ARGS__);\
} while(0)

所以,我只想获取 fmt##__VA_ARGS__ 的完整字符串,这样我就可以将它分配给 char * 对其执行一些额外的操作。

最佳答案

嗯,不。预处理发生在代码甚至被编译之前。它存在于与执行程序完全不同的宇宙中。您可以做的一件事是只运行预处理步骤并检查输出(使用 gcc 开关 -E 打印预处理器输出)。

您最多可以做的就是将其重定向到一个文件,然后在程序中读取该文件。


再想一想,让我从“不”改成“也许”。看看this other answer of mine ,它为可变参数宏实现了一个“foreach”宏。

因此,使用 APPLYXn(隐式地使用 PPNARG),您可以将 STR(x) #x 宏应用于 args像这样(n.b. 如所写,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;
}

编译器会将所有这些字符串文字连接成一个字符串。

关于c - 是否可以对可变参数宏进行字符串化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16229348/

相关文章:

c - 小于给定 n 的斐波那契数列的数量

c - 理解 C 中的指针结构

c - vfork 调用后的奇怪输出

Delphi 7 宏预处理器支持

macros - 如何避免在 Rust 中使用宏重复扩展索引?

c - 在 TCP header 中操作 ISN 号的最有效方法

c - 什么样的错误popen记录

C++ 循环重复代码

macros - 使用 Racket 宏生成 require-clauses

c++ - 我可以确定参数是否是字符串文字吗?