ACE代码疑惑求解
以下是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了。。。
表自己猜测,书上已经对这个问题有明确阐述了。
参考C++NPv2第5.4节 原帖由 modern 于 2010-3-5 08:26 发表 http://www.acejoy.com/bbs/images/common/back.gif
表自己猜测,书上已经对这个问题有明确阐述了。
参考C++NPv2第5.4节
晕,书上讲的ACE是n年前的版本了,这里是5.7.6版本... 你可以看看那个符号到底是什么不就清楚了 在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版本,这需要我们自己来做。
页:
[1]