【发布时间】:2012-10-02 21:26:42
【问题描述】:
C 中是否可以有相互引用的静态变量初始化器,如下例所示?
如果将第 2 行添加到预先声明的“B”中,则该示例将在 gcc -Wall 中编译,而不会发出警告。第 2 行令人讨厌,因为它也定义了 B,第 4 行也是如此。带有 -weak 检查的 splint 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*/
谢谢
【问题讨论】:
-
我想知道你为什么需要这个?
-
这是一个简化的例子。在我的嵌入式应用程序中,这项技术初始化了一个显示在 20x4 LCD 显示器上的菜单链接列表。每个菜单都有指向相邻导航菜单的指针。
-
抛开非问答题不谈,将菜单存储在数组中并通过索引而不是指针链接是否更简单?
-
听起来像夹板不理解暂定定义。我建议您向开发人员提交错误报告。
标签: c gcc static initialization