电脑技术学习

__declspec关键字详细用法

dn001

用法如下:
struct S {
int i;
void putprop(int j) {
;;;i = j;
}
int getprop() {
;;;return i;
}
__declspec(property(get = getprop, put = putprop)) int the_prop;
};

int main() {
S s;
s.the_prop = 5;
return s.the_prop;
}

selectany
格式:__declspec(selectany) declarator
在MFC,ATL的源代码中充斥着__declspec(selectany)的声明。selectany可以让我们在.h文件中初始化一个全局变量而不是只能放在.cpp中。比如有一个类,其中有一个静态变量,那么我们可以在.h中通过类似__declspec(selectany) type class::variable = value;这样的代码来初始化这个全局变量。既是该.h被多次include,链接器也会为我们剔除多重定义的错误。对于template的编程会有很多便利。
用法如下:

__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,对外部可见

extern const int x4;
const __declspec(selectany) int x4=4; //正确,x4是extern const,对外部可见

extern __declspec(selectany) int x5; //错误,x5未初始化,不能用__declspec(selectany)修饰

class X {
public:
X(int i){i++;};
int i;
};

__declspec(selectany) X x(1); //正确,全局对象的动态初始化

thread
格式:__declspec(thread) declarator
声明declarator为线程局部变量并具有线程存储时限,以便链接器安排在创建线程时自动分配的存储。
线程局部存储(TLS)是一种机制,在多线程运行环境中,每个线程分配自己的局部数据。在标准多线程程序中,数据是在多个线程间共享的,而TLS是一种为每个线程分配自己局部数据的机制。
该属性只能用于数据或不含成员函数的类的声明和定义,不能用于函数的声明和定义。
该属性的使用可能会影响DLL的延迟载入。
该属性只能用于静态数据,包括全局数据对象(static和extern),局部静态对象,类的静态数据成员;不能用于自动数据对象。
该属性必须同时用于数据的声明和定义,不管它的声明和定义是在一个文件还是多个文件。
__declspec(thread)不能用作类型修饰符。
如果在类声明的同时没有定义对象,则__declspec(thread)将被忽略,例如:

// compile with: /LD
__declspec(thread) class X
{
public:
int I;
} x;//x是线程对象
X y;//y不是线程对象

下面两个例子从语义上来说是相同的:

__declspec(thread) class B {
public:
int data;
} BObject;//BObject是线程对象

class B2 {
public:
int data;
};
__declspec(thread) B2 BObject2;// BObject2是线程对象

uuid
格式:__declspec( uuid("ComObjectGUID") ) declarator
将具有唯一标识符号的已注册内容声明为一个变量,可使用__uuidof()调用。
用法如下:
struct __declspec(uuid("00000000-0000-0000-c000-000000000046")) IUnknown;
struct __declspec(uuid("{00020400-0000-0000-c000-000000000046}")) IDispatch;

标签: