1、简介
__declspec是一个Microsoft Visual C++特定的编译器属性开关。括号中指明的是哪一个属性生效。关于__declspec的其他属性可以使用' __declspec'搜索MSDN进行查看。
selectany可以在.h文件中初始化一个全局变量而不是只能放在.cpp中。如类中有一个静态变量,可以在.h文件中通过类似" __declspec(selectany) type class::variable = value; "来初始化这个全局变量。就算该.h被多次include,链接器也会为我们剔除多重定义的错误,对于 teamplate的编程会有很多便利。
2、何时使用__declspec(selectany)
selectany可以被用于当定义有初始化全局变量数据的头文件被应用于多于一个的源文件时,即被多次包含。
2.1 格式
__declspec(selectany) declarator
2.2 用法
__declspec(selectany) int x1=1; //正确,x1被初始化,并且对外部可见
const __declspec(selectany) int x2 =2; //错误,在C++中,默认情况下const为static;但在C中是正确的,其默认情况下const不为static
extern const __declspec(selectany) int x3=3; //正确,x3是extern const,对外部可见
const __declspec(selectany) int x4=4; //正确,x4是extern const,对外部可见
extern __declspec(selectany) int x5; //错误,x5未初始化,不能用__declspec(selectany)修饰
声明后是参数的类型,必须初始化了才能使用。
3、__declspec(selectany)的作用
1)基于程序结构的整齐
统一将全局变量定义在一个全部cpp都引用的头文件,这样也就避免了在每个cpp中用extren导入外部变量。
2)模板的设计
模板不可能只被一个cpp文件所使用,按照习惯一般写在头文件中,对于模板,实在编译期间完成的,因此必须在编译时同时找到模板的定义和实现。就不能将类的声明放在头文件,将实现放在cpp中。类的静态成员必须在类外部初始化,如果是全写在头文件,当头文件include多于一次的时候就会出现类的静态变量重定义的问题。为了避免这种情况,可使用__declspec(selectany)在头文件中声明。
定义常量时不需要使用这个开关,可以使用const修饰。