我有一些需要在多源文件上共享的全局变量。我已阅读此帖share variables on different C files并执行以下操作:
fileA.h :
extern int a;
fileA.c
int a;
// using a variable here
一切都编译好,工作正常。但是因为我在多线程环境中编程,所以我在每个变量之前加上volatile
关键字。所以现在是:
fileA.h :
extern volatile int a;
fileA.c
int a;
// using a variable here
但是当我使用这种方式时,我在编译时遇到错误:
错误:包含的文件中“a”的冲突类型限定符 fileA.c:4:0:
请为我解释原因,以及如何解决这个问题?在这种情况下我们应该使用volatile
吗?
谢谢:)
答案 0 :(得分:2)
变量的任何声明都应该与其实际定义一致。因此,如果extern volatile int a;
的包含文件中的声明应该在实际定义变量的文件中具有关联的volatile int a;
。
另见本文How to use C's volatile keyword,包括有关多线程应用程序的一些信息。
请注意,对于多线程应用程序,您可能需要使用某种锁定或其他互斥机制与共享变量。见Why is volatile not considered useful in multi-threaded C or C++ programs
volatile关键字的主要作用是通知编译器变量可能会从当前作用域之外的某些操作发生变化,因此它会影响编译器生成机器代码的方式。
请参阅此简短文章Compiler optimization and the volatile keyword。
请参阅Dobbs博士的文章volatile: The Multithreaded Programmer's Best Friend