【发布时间】:2021-10-03 14:32:40
【问题描述】:
我试图弄清楚如何编写一个预处理器宏,该宏只有在存在参数时才会“字符串化”其参数
例如:
STRINGIFY(foo) -> "foo"
STRINGIFY() ->
在我非常基本的例子中:
#define STRINGIFY(x) #x
调用 STRINGIFY() 的结果是 "" 而不是什么都没有(这是我想要的)
如何做到这一点?
编辑
作为我为什么想要这种行为的一个例子,我正在使用宏来为这样的字符串数组生成一个初始化器
const char* STRINGS[] = {MAP_LIST(STRINGIFY, __VA_ARGS__)};
其中 MAP_LIST 来自以下项目:https://github.com/swansontec/map-macro
如果我的 VA_ARGS 里面有项目,您最终会得到例如以下内容:
const char* STRINGS[] = {"a", "b", "c"};
但如果 VA_ARGS 为空,我会得到:
const char* STRINGS[] = {""};
因为,当你“字符串化”一个空参数时,它会给你一个空字符串。
【问题讨论】:
-
在非字符串的情况下你会如何使用它?
-
为什么不带参数调用它?
-
这似乎更像是
MAP_LIST()的问题。它不能正确处理空列表,它会调用该函数一次。 -
嗯... 0 大小的数组是非法的。您基本上是在努力获得无效的声明。
-
@0___________,每个版本的 C 语言规范都不允许零长度数组。一些实现(特别是 GCC)接受它们作为扩展。
标签: c c-preprocessor