类名与关键字之间的宏定义

有一些类的定义如下:   class   DLLEXPORT   className   {   .......   };   

问:   DLLEXPORT   可以是什么关键词,请列出他们并说明一下他们的作用   
谢谢!  

------解决方案--------------------------------------------------------  
DLLEXPORT不是关键词。   
你自己查找到它的定义就知道了。   
按C++标准,class 与className 中间不可以存在任何实质性的东西的。   
------解决方案--------------------------------------------------------  
DLLEXPORT是修饰符,看它的具体定义是什么。   
一般类的修饰符有导入或导出等,即:   
__declspec(dllexport)   
extern __declspec(dllimport)   
------解决方案--------------------------------------------------------  
google __declspec(dllexport)   
http://www.cnblogs.com/googfly/archive/2005/06/10/172065.html   
------解决方案--------------------------------------------------------  
基本上DLLEXPORT是一个宏,这是windows平台下为了dll的兼容性的特有关键字(VC是的,其他的如BCB是不是我不清楚)。   

为什么要有这个宏呢?首先要搞清楚你加载一个dll时,其实你的程序是运行在两个独立空间的(dll的空间和你自己的程序空间),dll的对象模型其实相当严格,要访问dll空间的变量和函数,必须导出他们,否则这些对象是不可见的。这可以通过加入一个def文件,或者在声明中使用__declspec(dllimport)前缀,告诉编译器以下这些变量和函数是从dll导出的。同时定义这些变量的dll源文件必须加上__declspec(dllexport)前缀,告诉编译器这些函数需要被导出。   

对类对象来说,静态成员和函数必须加上这个前缀,因为这些对象都是在dll空间内的。在类的前面加上这些前缀就对整个类的成员进行了声明。   

因此一般这样写一个宏:   
#if defined __DLLEXPORT_IMP   
#define __DLLEXPORT __declspec(dllexport)   
#else   
#define __DLLEXPORT __descspec(dllimport)   
#endif   

这样在你的dll工程中定义__DLLEXPORT_IMP,__DLLEXPORT就会根据不同的工程转换成相应的前缀声明了。如果不加入这些前缀,链接会出现找不到符号的错误,因为这些符号在lib文件中被隐藏了。   


 
新手请教:C++定义时,以class和类名中间的那个修饰符是什么意思?  
发布日期:2010-11-11最近更新:2010-11-11来源:BHCODE作者:  
   
C++中,在定义类时,有时,class和类名中间还有个修饰,这个修饰符是什么意思?  
比如今天看mysql connector / C++中的一个定义:  
C/C++ code  

class CPPCONN_PUBLIC_FUNC MySQL_Connection : public sql::Connection  

{  
public:  
......  
}  

这里MySQL_Connection 是类名,在类名和class中间的CPPCONN_PUBLIC_FUNC是什么意思?  
________________________________________  
CPPCONN_PUBLIC_FUNC是一个宏定义  
________________________________________  
http://dev.mysql.com/doc/refman/5.1/en/connector-cpp-apps-windows-visual-studio.html  
________________________________________  
C/C++ code  
#if defined __DRAW_IMPL__  
#if (defined _AFXDLL && !defined __STAT_WITH_DLLMFC__)  
#define __DRAW_API _declspec(dllexport)  
#else  
#define __DRAW_API  
#endif // _AFXDLL  

#else   
#if (defined _AFXDLL && !defined __STAT_WITH_DLLMFC__)  
#define __DRAW_API _declspec(dllimport)  
#else  
#define __DRAW_API  
#endif // _AFXDLL  



#pragma message(" (Professional User Interface Suite)")  
#pragma comment( lib, __DRAW_LIB_NAME )   

#endif // defined __DRAW_IMPL__  
一般在编写动态链接库里的类时,经常会定义象上面的宏,主要是为了使用方便,这样在编写库时,只要定义了__DRAW_IMPL__宏,所有动态库中的类都会自动导出,  

例如:class __DRAW_API A{};编译时会被展开成calss _declspec(dllexport) A{};  

而在用户使用时,因为没有定义__DRAW_IMPL__宏,所有的类自动加上dllimport成为导入类,成为class _declspec(import).  

如果静态链接时或者直接使用时,只要定义了__STAT_WITH_DLLMFC__宏,相当于直接定义类,__DRAW_API被展开成空串.  




________________________________________  
我主要是不明白在class和类名中间加个东西,这种写法是什么意思,比如你提到的:  
calss _declspec(dllexport) A{};  
这里_declspec(dllexport)和类A是什么关系呢?  
class A{};  
是指定义一个类A。加上_declspec(dllexport),对类A的影响是什么呢?  
________________________________________主要是为了方便使用,比如你不这样定义,当你把这个类封装成一个动态库是,你在写类库时,会写在class _declspec(dllexport) A{};并假定把这个类声明放在a.h文件中,并将这个类打包成a.dll,如果用户在使用时,他会怎么用呢?  
他一定要改掉你的a.h中关于类A的声明为class _declspec(import) A{};这样,才能在程序中使用你的a.dll这个动态库,再假设这个库里几十个类。。。。。如果你是用户,你会不会想去撞墙。。。。呵呵
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值