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 的结尾