使用全局变量时可以省略“ extern”吗?

问题描述

最近我在C语言中发现了一个关于'extern'的奇怪东西

valid,didn't get a compile error

当我使用SESSION_COOKIE_DOMAIN = os.environ.get('SESSION_COOKIE_DOMAIN','mysite.com') 进行编译时,结果很好,没有编译错误(也没有警告!)。输出gcc tmp.c tmp2.c -o tmp -Wall。但是以下代码不会通过链接过程(唯一的区别是我在第二个文件中初始化了1

This won't do

似乎编译器将任何未初始化的变量视为外部变量?

解决方法

int x = value;x的定义。在文件作用域中使用其中两个会创建多个定义,从而导致链接错误。

文件范围内的

int x;是一个临时定义。根据C标准,在同一个翻译单元(正在编译的源文件,包括所有包含的文件)中没有常规定义的情况下,它用作定义。

当在一个翻译单元中提供定义并在另一翻译单元中提供相同标识符的暂定定义时,C标准未定义行为,但是Unix工具通常允许合并暂定定义,从而允许链接完成。