C 如何定义外部变量和声明?

C 如何定义外部变量和声明?,c,c99,extern,gcc-warning,initializer,C,C99,Extern,Gcc Warning,Initializer,说: extern关键字表示“声明而不定义”。换句话说,它是一种显式声明变量的方法,或者在没有定义的情况下强制声明也可以显式定义变量,即强制定义。这是通过将初始化值分配给变量来完成的 这意味着,初始化变量的extern声明用作该变量的定义。所以 这是不应该的。阿福 extern int y = 0; 实际上与 int i = 0; 这里出了什么问题?此代码完全有效 但任何编译器都可以自由发布附加(信息性或非信息性)诊断: (C99,5.1.1.3p1 fn 8)“当然,只要有效程序仍

说:

extern
关键字表示“声明而不定义”。换句话说,它是一种显式声明变量的方法,或者在没有定义的情况下强制声明也可以显式定义变量,即强制定义。这是通过将初始化值分配给变量来完成的

这意味着,初始化变量的
extern
声明用作该变量的定义。所以

这是不应该的。阿福

extern int y = 0;  
实际上与

int i = 0;  

这里出了什么问题?

此代码完全有效

但任何编译器都可以自由发布附加(信息性或非信息性)诊断:

(C99,5.1.1.3p1 fn 8)“当然,只要有效程序仍然正确翻译,实现就可以自由生成任意数量的诊断。”

编译器不能做的是在存在约束或语法冲突时不发出诊断

编辑:

正如OP问题评论中所述,
gcc
团队的Joseph Myers在提问中解释了该诊断:

“这是一个编码风格的警告-代码是有效的,但非常重要 因为“extern”通常意味着 声明未提供对象的定义。”


本标准的所有三个版本——ISO/IEC 9899:1990、ISO/IEC 9899:1999和ISO/IEC 9899:2011——在标题为“外部对象定义”(C90的§6.7.2和C99和C11的§6.9.2)的章节中包含一个示例,其中显示:

例1

int i1 = 1;        // definition, external linkage
static int i2 = 2; // definition, internal linkage
extern int i3 = 3; // definition, external linkage
int i4;            // tentative definition, external linkage
static int i5;     // tentative definition, internal linkage
示例继续,但是
extern int i3=3行清楚地表明标准表明它应该被允许。但是,请注意,本标准中的示例在技术上不是“规范性的”(见本标准前言);它们不是关于什么是允许的、什么是不允许的明确声明


也就是说,大多数人在大多数情况下不使用
extern
和初始值设定项。

可能也有帮助。不是公认的答案,而是一个接一个的答案。请特别注意答案的最后一行:只需在编译器设置中禁用此警告(并请向GCC团队写一封粗鲁的信)。@devnull只需写一个答案,如果你不想要代表,那就让它成为社区wiki@ShafikYaghmour您可以通过在链接问题中向上投票选择正确答案,向下投票选择不太正确的答案来提供帮助。@devnull这看起来不像是一个确切的dup,尽管它们是相关的。这似乎是一个警告,这可能不是程序员想要的警告类型(比如对
if(i=5){…}
)的警告,而不是按照语言对代码有任何错误。除此之外,它是一个有效的C代码。我认为GCC错误报告中最相关的部分是:“这是一个编码风格的警告-代码是有效的,但对于C来说非常不规则,因为”extern“通常意味着声明没有提供对象的定义。”我认为可能值得添加这个示例(我在回答中引用了这个示例)从C99/C11标准到错误报告。@ShafikYaghmour添加了一个编辑以覆盖部分错误报告content@ouah您已经有了我的+1,但我感谢您将其添加到中。我正在搜索第6.7.9节以查找任何相关的引用或示例。
int i = 0;  
int i1 = 1;        // definition, external linkage
static int i2 = 2; // definition, internal linkage
extern int i3 = 3; // definition, external linkage
int i4;            // tentative definition, external linkage
static int i5;     // tentative definition, internal linkage