引用另一个C源文件中声明的volatile变量时,是否需要extern关键字?

时间:2014-05-22 17:20:47

标签: c volatile extern

我有两个C源代码文件;一个文件包含如下声明:

volatile unsigned char flag=0; 

另一个C文件包含一个引用,例如:

extern unsigned char flag; 

这是正确和安全的,还是应该在引用变量时重复volatile关键字?即

extern volatile unsigned char flag; 

2 个答案:

答案 0 :(得分:9)

不,这不正确。

同一个变量的所有声明都需要使用完全相同的类型,volatile是该类型的一部分(extern不是)

检查extern声明的一个好方法是将它们放在头文件中,该头文件也包含在定义存在的编译单元中。然后编译器会检查它们的正确性。

Notice what happens if you do that on this example

prog.c:2:22: error: conflicting type qualifiers for ‘flag’
 extern unsigned char flag; 
                      ^
prog.c:1:24: note: previous definition of ‘flag’ was here
 volatile unsigned char flag=0;

答案 1 :(得分:4)

C99标准的一些引用(强调添加)

  

6.2.5 / 25类型

     

目前提到的任何类型都是不合格的类型。每个不合格   type有几个合格的类型,对应于   const,volatile和的一个,两个或全部三个的组合   限制限定符。 a的合格或不合格版本   类型是不同的类型

     

6.2.7 / 2"兼容类型和复合类型"

     

如果类型相同,则两种类型具有兼容类型。

     

...

     

引用同一对象或函数的所有声明都应具有   兼容型;否则,行为未定义

如果您暂时考虑一下您的具体示例,那么代码只能看到以下声明:

extern unsigned char flag; 

有任何想法flag需要被视为volatile吗?

此外,与您的问题无关,请注意volatile通常不足以通过多个线程处理访问权限(如果您正在考虑的话)。