先看这段文字


今天看C++ Primer关于头文件定义的一节,其中说到,头文件应用于声明而不是用于定义。其实,C++标准并没有规定头文件中不能定义 变量,只不过如果在头文件中定义变量,而该头文件又被多次包含的话,会造成变量的重新定义。 这里还涉及到另一个问题,需要提前说明,即使用预处理器避免多重包含。这里的多重包含指的是同一个文件直接或者间接的包含一个头文件多次,例如a.h包含 b.h,a.cpp同时包含a.h和b.h,a.cpp就两次包含了b.h。但由于b.h中具有避免多重包含的措施,a.cpp中还是只包含了b.h一 次。而包含的意思其实就是在预处理阶段用被包含文件的内容代替此包含语句。 回到头文件定义变量的问题上,如果在头文件中定义了变量,避免多重包含的措施只能避免该头文件在同一个编译单元内被包含一次,在不同的编译单元内还是会被多次包含的,这样就造成了变量的重复定义。 但是也有例外,如果const对象在编译时可以确定其值,可以将其放在头文件中定义。这么做是有原因的——const对象默认情况下是定义该变量的文件的 局部变量,这样即使此头文件被多个包含,都不会在包含这些文件中重复定义此变量,所有对于这个const对象的引用全都指向在头文件中定义的对象。如果在 const对象定义的时候声明extern,const对象就变得和普通非const对象一样,从而失去此特性(非const对象的默认属性为 extern)。 C++中的很多用法都不是标准C++规定的,但是由于各种原因,已经是约定俗成或是惯常用法,至于原因以及除此之外的其他用法完全可以不必深究,否则很容易钻牛角尖!


今天移植gamedev里文章讲到的一个例子的时候碰到了这个问题,要在头文件里给一个变量定义。

最后这样就可以了

1
2
//16Bit format for video card
const int PixelFormat = PF_555;

之前有些程序把一些库的变量定义都放到了主文件中,搞得非常难看,这下搞定了。 相应的在头文件里定义结构用typedef而不要去用struct!

发表评论