C相互引用静态初始值设定项

a b*_*a b 8 c static gcc initialization

在C中是否可以相互引用静态变量初始值设定项,如下例所示?

该示例在gcc -Wall中没有警告的情况下编译,如果将第2行添加到预先声明"B".第2行是令人反感的,因为它也定义了B,第4行也是如此.带有-weak检查的夹板lint程序警告"B"被定义两次:" 变量B重新定义.重新定义了一个函数或变量.其中一个声明应该使用extern."

通常,声明将使用extern关键字进行,但extern和static不能一起使用,也不会在gcc下编译.

#include <stdio.h>                               /*1*/
volatile static void * B;                        /*2*/
volatile static void * A = &B;                   /*3*/
volatile static void * B = &A;                   /*4*/
int main()                                       /*5*/
{                                                /*6*/
    printf("A = %x, B = %x\n", (int)A, (int)B);  /*7*/
    return 0;                                    /*8*/
}                                                /*9*/
Run Code Online (Sandbox Code Playgroud)

谢谢

AnT*_*AnT 5

尽管存在volatile与之相关的奇怪位置static,但您发布的代码完全有效C.它使用称为临时定义的C特定功能.此功能可确保B您的程序中只有一个:定义B同一实体的两个定义.它没什么"令人反感"的.

从夹板获得的警告无效.在C++语言中,这确实构成了多重定义错误,但在C语言中却没有.评论extern在C语言的上下文中没有任何意义.