我正在用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

    08-16 07:48