找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 8566|回复: 4

ACE代码疑惑求解

[复制链接]
发表于 2010-3-5 00:52:03 | 显示全部楼层 |阅读模式
以下是ACE_OS_Object_Manager类的定义,这里ACE_Export起什么作用?(后面看到是宏定义)达人们是否可以详细分析下ACE_Export所起的作用?

该类定义位于ace/Object_Manager_base.h。
class
ACE_Export ACE_OS_Object_Manager : public ACE_Object_Manager_Base  
{
public:
  /// Explicitly initialize.
  virtual int init (void);

  /// Explicitly destroy.
  virtual int fini (void);

  ..... // 省略了一些代码

  friend void ACE_OS_Object_Manager_Internal_Exit_Hook ();
};

选中ACE_Export执行Go to Defination跳转到ace/ACE_export.h,这里面ACE_Export定义为:

define ACE_Export ACE_Proper_Export_Flag
define ACE_Export ACE_Proper_Import_Flag
define ACE_Export

最后一个定义为空,即后面没有东西,这个很好理解,即如果ACE_Export为空时,ACE_OS_Object_Manager定义中的ACE_Export修饰符相当于不起作用,那么当ACE_Export为ACE_Proper_Export_Flag或ACE_Proper_Import_Flag时,这个修饰符会产生什么作用呢?


选中ACE_Proper_Export_Flag和ACE_Proper_Import_Flag时,不能使用go to Defination了。。。

  
发表于 2010-3-5 08:26:48 | 显示全部楼层
表自己猜测,书上已经对这个问题有明确阐述了。
参考C++NPv2第5.4节
 楼主| 发表于 2010-3-5 21:42:57 | 显示全部楼层
原帖由 modern 于 2010-3-5 08:26 发表
表自己猜测,书上已经对这个问题有明确阐述了。
参考C++NPv2第5.4节
晕,书上讲的ACE是n年前的版本了,这里是5.7.6版本...
发表于 2010-6-30 20:49:44 | 显示全部楼层
你可以看看那个符号到底是什么不就清楚了
发表于 2010-7-13 21:13:01 | 显示全部楼层
在VC中,所有的导出函数要么在def文件中指定(只能针对C函数,系统函数都是采用这种方式),要么使用VC扩展指令指定(可以导出C++类和函数、全局变量),在需要导出类的地方需要使用__declspec(dllexport),则编译成DLL时,该类就会被导出,如:
class __declspec(dllexport) MyClass { };
而在需要使用该类的地方,则需要使用__declspec(dllimport)来导入,如:
class __declspec(dllimport) MyClass { };
由于我们使用的头文件都是一个,所以一般的都会采用宏的方式来分别这两种情况,你说的那个全部应该是这样的:
#if defined (ACE_HAS_DLL)
#  if (ACE_HAS_DLL == 1)
#    if defined (ACE_BUILD_DLL)
#      define ACE_Export ACE_Proper_Export_Flag
#      define ACE_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
#      define ACE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
#    else
#      define ACE_Export ACE_Proper_Import_Flag
#      define ACE_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
#      define ACE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
#    endif /* ACE_BUILD_DLL */
#  else
#    define ACE_Export
#    define ACE_SINGLETON_DECLARATION(T)
#    define ACE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
#  endif   /* ! ACE_HAS_DLL == 1 */
#else
#  define ACE_Export
#  define ACE_SINGLETON_DECLARATION(T)
#  define ACE_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
#endif     /* ACE_HAS_DLL */
这里分别根据使用编译ACE为DLL还是静态库来定义ACE_export宏(因为静态库并不需要前面的方式来导出、导入,所以后面的定义是空),而当你编译DLL时,则会是前面两种情况中的一种(如果你查看ACE_Proper_Export_Flag和ACE_Proper_Import_Flag,这二者分别定义为我前面说的情况,ACE编译DLL使用ACE_Proper_Export_Flag,即__declspec (dllexport),因为ACE工程中定义了ACE_BUILD_DLL宏,而我们的程序中只要不定义这个宏,则使用ACE_Proper_Import_Flag,即__declspec (dllimport),这样,我们就通过一个头文件实现了类的导出和导入了,而不需要分别写不同的头文件)。
另外,从VC2005开始,如果我们新建DLL工程,当你在Application Settings页面选中Export symbols时,VS也会帮我们生成类似的定义。省去了一些工作,之前的VC版本,这需要我们自己来做。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-3-29 13:30 , Processed in 0.039763 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表