头文件用于声明而不是定义
一.背景
昨天脑袋有点发蒙,在.h中定义了一个全局变量CCriticalSection g_CriticalSection;然后就报了若干个LNK2005:重复定义的链接错误(单个cpp文件单独编译时不会发现问题,而链接时把把信息汇总,就会发现问题咯).原因是不应该在头文件中定义全局变量.
正确定义全局变量的方法是,在一个cpp中定义全局变量,然后在别的用到的cpp文件中使用extern来找到该变量.
参考文章:error:LNK2005 已经在*.obj中定义
二.延伸
后来查了下,在<C++ Primer>中有一条指导原则--头文件用于声明而不是定义.
比如 extern int i =10; //虽然声明为extern,但是它是初始化式,表明是一个定义.若写成extern int i;则是一种声明咯.
再如 double f; //不加extern,自然是声明了.
不过,存在这一原则存在3个例外,头文件可以定义类, 值在编译时就已知的const对象和inline函数.
新战场:https://blog.csdn.net/Stephen___Qin