gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:02:37 25 4
gpt4 key购买 nike

在 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*/

谢谢

最佳答案

尽管 volatile 相对于 static 的位置很奇怪,但您发布的代码是完全有效的 C。它使用了一个名为 tentative definitions 的特定于 C 的功能。此功能可确保您的程序中只有一个 B:B 的两个定义定义相同的实体。没有什么“令人反感”的。

你从 splint 得到的警告是无效的。在 C++ 语言中,这确实会构成多重定义错误,但在 C 中不会。关于 extern 的注释在 C 语言的上下文中毫无意义。

关于C 相互引用静态初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12698586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com