C 在宏中包含期间

C 在宏中包含期间,c,macros,c-preprocessor,C,Macros,C Preprocessor,是否可以定义常量,例如foo.barvia #define foo.bar 42 当我尝试上面的foo时,它被扩展到.bar 42。是否有任何方法可以转义句点或解决此问题?否,C预处理器宏名称中不允许使用句点字符 但是,在这种情况下,您可以在不使用预处理器的情况下实现类似的效果: static struct { int bar; } foo = {42}; 在C语言中,宏名称必须是有效的标识符,这意味着您不能在宏名称中使用。正如Greg所说,宏名称中不允许使用句点字符。然而,宏是很棘手的。很

是否可以定义常量,例如
foo.bar
via

#define foo.bar 42

当我尝试上面的
foo
时,它被扩展到
.bar 42
。是否有任何方法可以转义句点或解决此问题?

否,C预处理器宏名称中不允许使用句点字符

但是,在这种情况下,您可以在不使用预处理器的情况下实现类似的效果:

static struct { int bar; } foo = {42};

在C语言中,宏名称必须是有效的标识符,这意味着您不能在宏名称中使用

正如Greg所说,宏名称中不允许使用句点字符。然而,宏是很棘手的。很容易定义
foo
进入某种中间状态,定义
bar
解析该状态并可能生成
42

#define foo RESOLVE_STATE(
#define bar , 42 )
#define RESOLVE_STATE( DOT, RESOLUTION ) RESOLUTION
不幸的是,中间状态具有不利的语义。它接受宏参数,直到找到匹配的右括号。但是参数没有展开,因此括号必须按字面意思出现。您可以使用输入
foo.bar)
使其工作,但这不是很有用


需要明确的是,这是不可能的证明。

宏名称中不允许使用No
,因为它们是标识符,并且标识符不允许包含
。我们可以通过转到
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节
标识符涵盖了什么是有效标识符。

但是没有办法使其成为一个积分常量表达式。有吗?你可以添加
const
并获得大部分路径。:)在C++中,如果您将其定义为“代码>静态const int < /Cuth>成员或<代码> conxPRP对象,则可能是编译时常数,但在C中,您可能意外声明VLA或某事:(.@GregHewgill)实际上我想换一种方式。我正在尝试使用结构来模拟名称空间,需要设置一个整数常量以用于数组长度。