我有两个C源代码文件;一个文件包含如下声明:
volatile unsigned char flag=0;
另一个C文件包含一个引用,例如:
extern unsigned char flag;
这是正确和安全的,还是应该在引用变量时重复volatile
关键字?即
extern volatile unsigned char flag;
答案 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
通常不足以通过多个线程处理访问权限(如果您正在考虑的话)。