我正在用C编写一些列表库作为练习。
我想知道C规范是否允许变量的声明和对其的引用同时进行,例如:
typedef struct _List {
int value;
struct _List* next;
} List;
List* TERMINATOR = {0, &TERMINATOR};
简而言之,可以写
void* p = &p;
吗?看来
gcc
允许这样做,但我想知道规范是如何的。先感谢您。
最佳答案
void *p = &p;
已验证。变量在其自身的初始化范围内。
然而,
List* TERMINATOR = {0, &TERMINATOR};
无效,因为
TERMINATOR
是此处的指针,而不是结构。如果您删除
*
,List TERMINATOR = {0, &TERMINATOR};
已验证。
参考:ISO 9899:1999, 6.2.1标识符的范围:
声明标签的类型说明符中的标签。每个枚举常量的范围
在其定义的枚举器出现在枚举器列表之后立即开始。 任何
其他标识符的作用域仅在其声明符完成之后才开始。
(强调我的)。
在
void *p = &p
中,声明符为*p
。