C++ 检查预处理器中的_declspec宏
如果我有一个定义为C++ 检查预处理器中的_declspec宏,c++,c-preprocessor,C++,C Preprocessor,如果我有一个定义为\uuudeclspec(dllimport)或\uudeclspec(dllexport)的宏,有没有办法在编译时检查正在使用哪个宏 也就是说,类似这样的事情: #if SOME_MACRO == __declspec(dllimport) // do something #else // do something else #endif UPD。 看看我得到的答案,我想我应该更具体地说明我为什么需要这个 我正在尝试编译一个相当大的第三方库,它的大部分代码都声明了一个函数
\uuudeclspec(dllimport)
或\uudeclspec(dllexport)
的宏
,有没有办法在编译时检查正在使用哪个宏
也就是说,类似这样的事情:
#if SOME_MACRO == __declspec(dllimport)
// do something
#else
// do something else
#endif
UPD。 看看我得到的答案,我想我应该更具体地说明我为什么需要这个 我正在尝试编译一个相当大的第三方库,它的大部分代码都声明了一个函数
dllexport
。但是,有一个组件是dllimport
我需要为dllimport
案例略微修改声明。这两个声明之间的切换不是很简单,它是分布在多个文件中的相当深的#ifdef
指令树的结果。原则上,我可以从这些指令中挖掘出这些信息,但为了确保我做得正确,我必须尝试在几种不同的配置下编译整个库(每次编译需要几个小时)
另一方面,如果有一种简单的方法来检查他们的某个\u宏
是否被计算为导入或导出,我可以在一个小程序上进行测试,快速安全地将其放入库中。您不能使用
#if SOME_MACRO == __declspec(dllimport)
\uu declspec(dllimport)
不是预处理器表达式的有效标记
最好的选择是使用另一个预处理器宏,例如:
// Are we building the DLL?
#if defined(BUILD_DLL)
// Yes, we are.
#define SOME_MACRO __declspec(dllexport)
#else
// No. We are using the DLL
#define SOME_MACRO __declspec(dllimport)
#endif
现在,您可以使用:
#if defined(BUILD_DLL)
根据您是在构建DLL还是在使用DLL,包含条件代码
实际上,这最终会涉及到更多的问题
BUILD\u xxx\u DLL
。假设您有两个DLL,实用程序和核心。以及依赖于两者的应用程序#if defined(BUILD_UTILITY_STATIC)
#define UTLIITY_EXPORT
#elif defined(BUILD_UTILITY_DLL)
#define UTLIITY_EXPORT__declspec(dllexport)
#else
#define UTLIITY_EXPORT__declspec(dllimport)
#endif
当然,您不希望在许多.h文件中重复相同的代码。您将创建一个包含上述内容的.h文件,并将其包含在所有其他.h文件中
在构建utility.dll时,您需要定义BUILD\u utility\u dll
并保持BUILD\u utility\u STATIC
未定义
在构建utllity.lib(静态库)时,需要定义BUILD\u UTILITY\u static
并保持BUILD\u UTILITY\u DLL
未定义
utility.dll的用户将保持BUILD\u utility\u STATIC
以及BUILD\u utility\u dll
未定义
utility.lib(静态库)的用户需要定义BUILD\u utility\u static
并保持BUILD\u utility\u DLL
未定义
core.dll和core.lib需要一个类似的文件。您不能使用
#if SOME_MACRO == __declspec(dllimport)
\uu declspec(dllimport)
不是预处理器表达式的有效标记
最好的选择是使用另一个预处理器宏,例如:
// Are we building the DLL?
#if defined(BUILD_DLL)
// Yes, we are.
#define SOME_MACRO __declspec(dllexport)
#else
// No. We are using the DLL
#define SOME_MACRO __declspec(dllimport)
#endif
现在,您可以使用:
#if defined(BUILD_DLL)
根据您是在构建DLL还是在使用DLL,包含条件代码
实际上,这最终会涉及到更多的问题
BUILD\u xxx\u DLL
。假设您有两个DLL,实用程序和核心。以及依赖于两者的应用程序#if defined(BUILD_UTILITY_STATIC)
#define UTLIITY_EXPORT
#elif defined(BUILD_UTILITY_DLL)
#define UTLIITY_EXPORT__declspec(dllexport)
#else
#define UTLIITY_EXPORT__declspec(dllimport)
#endif
当然,您不希望在许多.h文件中重复相同的代码。您将创建一个包含上述内容的.h文件,并将其包含在所有其他.h文件中
在构建utility.dll时,您需要定义BUILD\u utility\u dll
并保持BUILD\u utility\u STATIC
未定义
在构建utllity.lib(静态库)时,需要定义BUILD\u UTILITY\u static
并保持BUILD\u UTILITY\u DLL
未定义
utility.dll的用户将保持BUILD\u utility\u STATIC
以及BUILD\u utility\u dll
未定义
utility.lib(静态库)的用户需要定义BUILD\u utility\u static
并保持BUILD\u utility\u DLL
未定义
core.dll和core.lib需要一个类似的文件。宏由dll创建者命名
- 您需要在导出或导入模式下工作的头文件
- 将使用C/C++文件创建程序,以构建DLL(导出)
- 其他C/C++文件将用于调用DLL(导入函数)
在标题中,如果定义了宏,则模式设置为导出。使用DLL时,不会定义宏并导入函数。宏由DLL创建者命名
- 您需要在导出或导入模式下工作的头文件
- 将使用C/C++文件创建程序,以构建DLL(导出)
- 其他C/C++文件将用于调用DLL(导入函数)
在标题中,如果定义了宏,则模式设置为导出。使用DLL时,宏没有定义,函数被导入。 <代码> yO-DEXSPEC不是宏,它是VisualC++(兼容)编译器中的一个特殊关键字。使用同一个逻辑来确定某个宏的值。尽管如此,我还是想知道我想要的是什么