C 将volatile int变量定义为extern int

C 将volatile int变量定义为extern int,c,gcc,C,Gcc,如果变量在file1.c中定义为volatile int x,在file2.c中定义为extern int x(而不是extern volatile int x),会发生什么?编译器是否有机会知道x是易变的,并且在file2.c中编译,编译器只知道当前的源文件(基本上是包含所有内容的当前源文件),其他什么都不知道 如果extern变量没有使用正确的类型声明,那么您将有未定义的行为。编译器只知道当前的(基本上是包含所有内容的当前源文件),其他什么都不知道 如果未使用正确的类型声明extern变量,

如果变量在
file1.c
中定义为
volatile int x
,在
file2.c
中定义为
extern int x
(而不是
extern volatile int x
),会发生什么?编译器是否有机会知道
x
是易变的,并且在
file2.c

中编译,编译器只知道当前的源文件(基本上是包含所有内容的当前源文件),其他什么都不知道


如果
extern
变量没有使用正确的类型声明,那么您将有未定义的行为。

编译器只知道当前的(基本上是包含所有内容的当前源文件),其他什么都不知道


如果未使用正确的类型声明
extern
变量,则将有未定义的行为。

这就是标题的作用。避免在实现文件中使用
extern
声明。这有点像OT,但希望您不依赖
volatile
来实际为多线程程序中的C变量执行任何有用的操作?请参阅:…volatile的使用只能阻止编译器进行有用的、令人满意的优化,对使代码“线程安全”没有任何帮助。@AndrewHenle它适用于嵌入式系统。我不认为它是无用的。这就是标题的作用。避免在实现文件中使用
extern
声明。这有点像OT,但希望您不依赖
volatile
来实际为多线程程序中的C变量执行任何有用的操作?请参阅:…volatile的使用只能阻止编译器进行有用的、令人满意的优化,对使代码“线程安全”没有任何帮助。@AndrewHenle它适用于嵌入式系统。我不认为它是无用的。@i486全局变量(文件范围内的技术变量)默认具有外部链接。此外,没有初始化的声明是暂定定义,它可能是定义,也可能只是声明。阅读例如和以了解更多信息。@i486全局变量(文件范围内的技术变量)默认具有外部链接。此外,没有初始化的声明是暂定定义,它可能是定义,也可能只是声明。有关更多信息,请阅读例如和。