__declspec( selectany ) 含义
C/C++ 2007-12-30 14:22:31 阅读199 评论0 字号:大中小 订阅
selectany使用在c/c++工程的连接期间,一般用得很少,所以很陌生,最近在MFC的源代码中发现,查一下MSDN,很难懂,看了很久才明白了一眯。这里翻译一下。
这个属性告诉编译器声明的全局变量是一个"任一拣选"(pick-any)COMDAT.在连接时间,如果多个COMDAT定义能看到,连接器选择一个并且丢弃所有的剩余的。如果连接器选项/OPT:REF被选择,COMDAT中所有的没有引用的数据项被删除。
一个全局数据在EXE或者DLL中只能被初始化一次。当同一个头文件被多个源文件引用时,在头中定义全局数据始始化时,这个属性被使用。这个属性在c和c++的编译器中都是可用的。
COMDAT record
一个常用对象文件格式(COFF)记录,它包含的已被初始化的常用块数据和打包的函数对连接器是可以见的。
packaged function
当函数级的连接功能选择开关被打开时,一个函数能被编译器创建。在编译器产生的对象文件中COMDAT记录的打包的函数对于连接器是可见的。没有打包的函数只在对象级(the object level)上连接。
下面是MSDN上一些例子:
//Correct - x1 is initialized and externally visible
__declspec(selectany) int x1=1;
//Incorrect - const is by default static in C++, so
//x2 is not visible externally (This is OK in C, since
//const is not by default static in C)
const __declspec(selectany) int x2 =2;
//Correct - x3 is extern const, so externally visible
extern const __declspec(selectany) int x3=3;
//Correct - x4 is extern const, so it is externally visible
extern const int x4;
const __declspec(selectany) int x4=4;
//Incorrect - __declspec(selectany) is applied to the uninitialized
//declaration of x5
extern __declspec(selectany) int x5;