最近看代码,发现一个__declspec(selectany)的编译命令,查了下,以作记录。
__declspec(selelctany)的作用 写道
最近在用 template 编写singleton模式代码的时候,遇到了一个问题,template要求实现要在同一个文件中,所以,我只能在h文件中定义并实现 singleton 模式类。类中必然要有静态成员变量,静态成员变量的定义成了问题,如果我放在cpp文件中,模板是不支持的,放在h文件中,如果h文件被多次包含,会出现重定义的情况。
回来,请教高手,得知,可以在初始化静态成员变量前面加上__declspec(selectany) ,这样编译器会自动剔除对该静态成员的重复定义。
最近半年也一直用WTL,ATL,COM等。其实在WTL,ATL中已经大量使用了__declspec(selectany)方法。我猜想这是为解决template单文件编程和静态成员变量在头文件中定义会出现重复定义矛盾而提出的。
总的来说:
__declspec(selelctany) 使在头文件中定义静态成员变量可行。
参考网站:http://hi.baidu.com/samzyn/blog/item/82b34d7b4f0482f30ad1875f.html
分享到:
相关推荐
__declspec(dllexport)和__declspec(dllimport)的区别是什么
C++ __declspec关键字详细用法 __declspec关键字是C++语言中用于指定存储方式的扩展属性定义。它用于指定所给定类型的实例的与Microsoft相关的存储方式。__declspec关键字可以指定类型的对齐方式、存储段、应用程序...
declspec (extended-decl-modifier)其中,extended-decl-modifier 是一个参数,可能的取值包括 align、allocate、appdomain、deprecated、dllimport、dllexport、jitintrinsic、naked、noalias、noinline、noreturn...
`__declspec(selectany)` 允许在多个模块中定义相同名称的全局变量,编译器会合并这些变量的定义,从而节省内存。这在链接时静态初始化的数据中很有用。 8. **thread** `__declspec(thread)` 用于声明线程局部...
关于`extern "C"`,它是C++中用来兼容C的一个特性。在C++中,`extern "C"`告诉编译器这部分代码遵循C语言的规则,不进行名字修饰。这对于跨语言调用或者C++调用C库的函数是必要的。同时,`__declspec(dllexport)`和`...
本教程将详细解释如何在Win32 Software Development Kit (SDK)环境下,使用C语言通过`__declspec(dllexport)`关键字来导出DLL中的函数和全局变量。 首先,`__declspec(dllexport)`是Microsoft特定的关键字,用于...
declspec(dllexport)与_declspec(dllimport)的区别 在编程中, especially 在使用动态链接库(DLL)时,我们经常会遇到两个重要的关键字:__declspec(dllexport) 和 __declspec(dllimport)。它们都是由 Microsoft ...
在这个过程中,`_declspec(dllimport)` 和 `_declspec(dllexport)` 是两个非常关键的关键字,它们用于控制函数和类在DLL的编译和使用过程中的可见性和导出。下面将详细讲解这两个关键字的用途、工作原理以及如何在...
c++ 中__declspec 的用法如下,想要了解的继续往下看吧。 语法说明: __declspec ( extended-decl-modifier-seq ) 扩展修饰符: 1:align(#) 用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值。...
在VC++中,实现DLL导出的关键字是`_declspec(dllimport)`和`_declspec(dllexport)`。本文将详细介绍如何使用`_declspec(dllimport)`和`_declspec(dllexport)`来导出和导入函数。 1. **_declspec(dllimport)** 和 **...
extern "C" __declspec(dllexport) bool TifOpen(char* filename,char* model); extern "C" __declspec(dllexport) bool TifClose(); extern "C" __declspec(dllexport) int GetTifWidth(); extern "C" __declspec...
__declspec(dllexport) DeviceInfo* GetCurrentDefaultAudioDevice(); __declspec(dllexport) bool SetDefaultAudioPlaybackDevice(LPCWSTR devID); __declspec(dllexport) DeviceInfo* GetAudioOutputDevices...
在`CreateDLL`项目中,定义一个简单的函数,如`int add(int a, int b)`,并使用`__declspec(dllexport)`关键字导出。例如: ```cpp #ifdef CREATE_DLL #define DLL_EXPORT __declspec(dllexport) #else #define...