是否可以通过
定义常量,例如foo.bar
#define foo.bar 42
当我尝试将上述foo
扩展为.bar 42
时。有没有办法逃避这段时间或以其他方式解决这个问题?
答案 0 :(得分:3)
宏名称中不允许.
,因为它们是标识符,并且不允许标识符包含.
。我们可以通过转到draft C99 standard部分6.10
预处理指令来看到这一点,其中包含以下语法:
# define identifier replacement-list new-line
# define identifier lparen identifier-listopt ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line
^^^^^^^^^^
和部分6.4.2
标识符涵盖了有效的标识符。
答案 1 :(得分:2)
不,C预处理器宏名称中不允许使用句点字符。
但是,在这种情况下,您可以在不使用预处理器的情况下实现类似的效果:
static struct { int bar; } foo = {42};
答案 2 :(得分:1)
在C中,宏名称必须是有效的标识符,这意味着您无法在宏名称中使用.
。
答案 3 :(得分:1)
正如Greg所说,宏名称中不允许使用句点字符。但是,宏很棘手。定义foo
以进入某个中间状态很有诱惑力,bar
来解决该状态并可能生成42
。
#define foo RESOLVE_STATE(
#define bar , 42 )
#define RESOLVE_STATE( DOT, RESOLUTION ) RESOLUTION
不幸的是,中间状态具有不利的语义。它接受宏参数,直到找到匹配的右括号。但是参数没有扩展,所以括号必须按字面意思出现。您可以使用输入foo.bar)
使其工作,但这不是很有用。
要清楚,这是不可能的证据。