在宏中包含句点

时间:2014-03-11 01:55:49

标签: c macros c-preprocessor

是否可以通过

定义常量,例如foo.bar
#define foo.bar 42

当我尝试将上述foo扩展为.bar 42时。有没有办法逃避这段时间或以其他方式解决这个问题?

4 个答案:

答案 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)使其工作,但这不是很有用。

要清楚,这是不可能的证据。