selectany

Microsoft 专用

通知编译器声明的全局数据项 (变量或对象) 是选取任何 COMDAT (一个打包的功能)。

__declspec( selectany ) declarator

备注

在链接时,因此,如果 COMDAT 的多个定义显示,链接器选取一并丢弃其余操作。 如果链接器选项 /OPT: REF (优化) 处于选中状态,则 COMDAT 清除将会移除链接器输出的所有未引用的数据项。

构造函数和分配的全局函数或静态方法在声明不创建引用,并且不会阻止 /OPT: REF 清除。 ,而没有其他对数据存在时,不应依赖于从此类代码的副作用。

对动态初始化的,全局对象, selectany 将放弃一未引用的对象的初始化代码,。

全局数据项是 EXE 或 DLL 项目只能一次通常用于初始化。 selectany 可用于初始化头定义的全局数据,那么,当同一个标题显示在多个源文件时。 selectany 可在 C 和 C++ 编译器。

备注

selectany 只能应用于外部可见全局数据项的实际初始化。

示例

此代码演示如何使用 selectany 属性:

//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;

// OK: dynamic initialization of global object
class X {
public:
X(int i){i++;};
int i;
};

__declspec(selectany) X x(1);

,当同时使用 /OPT: ICF 链接器选项时,此代码演示如何使用 selectany 属性以确保数据 COMDAT 折叠。 监视 const (只读) 部分必须标有 selectany 和放置数据。 必须显式指定只读部分。

// selectany2.cpp
// in the following lines, const marks the variables as read only
__declspec(selectany) extern const int ix = 5;
__declspec(selectany) extern const int jx = 5;
int main() {
   int ij;
   ij = ix + jx;
}

特定于 Microsoft 的结尾

请参见

参考

__declspec

C++关键字