在c中全局定义变量的extern

std*_*all 10 c gcc global-variables extern

我有以下源代码,我感兴趣.

#include <stdio.h>
extern int foo;
int foo = 32;

int main()
{
printf("%d", foo);
}
Run Code Online (Sandbox Code Playgroud)

这是一段非常正常的代码,当我编译它时

gcc -Wall -Wextra -pedantic foo.c
Run Code Online (Sandbox Code Playgroud)

我没有得到任何警告.

这似乎很奇怪,因为变量既被定义为外部变量又被定义为同一文件中的全局变量.我很确定链接器很容易在同一个文件中找到外部变量的引用,但它看起来不像编码错误吗?如果是这样,为什么编译器不会对此发出警告?

Ale*_*nze 13

没有什么奇怪的.您首先声明了一个变量(您承诺编译器存在它),然后您实际定义了它.这没有问题.

此外,在默认情况下,是不是本地的功能,并没有定义为所有变量staticextern.


Arm*_*yan 8

你好像误解了什么extern.extern只是使你的声明只是一个声明而不是一个定义.

int i; //definition of i
extern int i; //declaration of i
Run Code Online (Sandbox Code Playgroud)

具有相同变量的多个声明是完全正常的,但整个程序中只应存在一个定义.将其与功能进行比较

void f(void); //declaration
void f(void) //definition(and redeclaration)
{
} //definition
Run Code Online (Sandbox Code Playgroud)

为了使用变量或函数,您只需要声明它.它的定义可能出现在程序的任何地方(链接器都会找到它).Anywhere可以是同一个文件,另一个文件,甚至是外部库.


oua*_*uah 7

它似乎已经过时了,因为变量既被定义为外部变量又被定义为同一文件中的全局变量.

extern int foo;
Run Code Online (Sandbox Code Playgroud)

说:它声明没有定义一个int名为的对象foo.

 int foo = 32;
Run Code Online (Sandbox Code Playgroud)

它声明并定义了一个用外部链接int命名的类型的对象foo.

没有矛盾,它是有效的C代码.