我正在编写一些列表库作为C中的练习.我想知道C规范是否允许变量的声明和对它的引用,例如: -
typedef struct _List {
int value;
struct _List* next;
} List;
List* TERMINATOR = {0, &TERMINATOR};
Run Code Online (Sandbox Code Playgroud)
总之,是否可以写void* p = &p;?
它似乎gcc允许这样,但我想知道规范是如何的.
先感谢您.
void *p = &p;
Run Code Online (Sandbox Code Playgroud)
已验证.变量在自己的初始化范围内.
然而,
List* TERMINATOR = {0, &TERMINATOR};
Run Code Online (Sandbox Code Playgroud)
是无效的,因为TERMINATOR这里是指针,而不是结构.
如果你删除*,
List TERMINATOR = {0, &TERMINATOR};
Run Code Online (Sandbox Code Playgroud)
已验证.
参考:ISO 9899:1999,6.2.1标识符的范围:
- 结构,联合和枚举标记具有在声明标记的类型说明符中标记出现之后开始的范围.每个枚举常量都具有在枚举器列表中定义枚举器出现之后开始的范围.任何其他标识符的范围都在其声明者完成之后开始.
(强调我的).
在void *p = &p,声明者是*p.
是的,这是完全合法的:
void* p = &p;
Run Code Online (Sandbox Code Playgroud)
p 标识符在其初始化块内的范围内,因此获取其地址是完全合法的.
请注意,虽然这是允许的,但它非常不同寻常.到目前为止,终止列表的最常用方法是将next指针设置为NULL.