今天遇到一个坑,在VS上进行多文件的编译运行的时候,在头文件中定义了全局变量a,该头文件被类的实现CPP和主函数所在的CPP包含且声明extern int a。但是在链接的时候报多重定义的错误。网上看了下,这篇文章给出了一个答案:能不能在头文件中定义全局变量?。总结起来就是,报错的原因就是有两个CPP,各自生成自己的OBJ,那么在查找符号的时候,都能发现对方那里也有一个变量a,那么就报错了。所以,如果你能保证你的头文件只被包含一次,那么可以在其中定义此外链接性的变量,如果无法保证的话,引用作者的话“那么你就任找一个源文件,把这个全局变量定义到这个源文件中,然后新建一个头文件,在里面进行extern 这个变量的声明,最后在需要使用这个全局变量的源文件中include你新建的头文件就OK了”。这种方法如果写起来makefile应该也不难,历来公共的接口、头文件都是放在一起,此用于共享全局变量的头文件放在这里,正常写就好了。
总结一下,可以把所有的全局变量放入一个头文件 global.h (名字随意起,但要加条件编译)中,每一个变量前面加extern,声明一下这些变量将在其它文件中定义。 然后建立一个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明所有的全局变量。