gpt4 book ai didi

c++ - 检查预处理器中的 __declspec 宏

转载 作者:行者123 更新时间:2023-11-28 01:38:27 25 4
gpt4 key购买 nike

如果我有 SOME_MACRO 定义为 __declspec(dllimport)__declspec(dllexport),有没有办法检查编译时用的是哪一个?

即像这样:

#if SOME_MACRO == __declspec(dllimport)
// do something
#else
// do something else
#endif

更新。看看我得到的答案,我想我应该更具体地说明我为什么需要这个。

我正在尝试编译一个相当大的第 3 方库,该库在包含它的大部分代码中都有一个声明为 dllexport 的函数。但是,有一个组件是 dllimport

我需要针对 dllimport 案例略微修改声明。两个声明之间的切换不是很简单,它是相当深的 #ifdef 指令树分布在多个文件中的结果。原则上,我可以从这些说明中挖掘出这些信息,但为了确保我做得正确,我必须尝试在几种不同的配置下编译整个库(每次编译需要几个小时)。

另一方面,如果有一种简单的方法来检查它们的 SOME_MACRO 是否被评估为导入或导出,我可以在一个小程序上快速测试它并安全地将其放入库中。

最佳答案

你不能使用

#if SOME_MACRO == __declspec(dllimport)

__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 来包含条件代码。


实际上,这最终会涉及更多一些。

  1. 大多数项目都有不止一个 DLL。 BUILD_DLL 将无法运行。您构建的每个 DLL 都需要 BUILD_xxx_DLL。假设您有两个 DLL,实用程序和核心。以及依赖于两者的应用程序。

  2. 您可能还需要创建一个静态库。

实用程序库的每个公共(public) .h 文件中都需要类似以下内容。

#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 文件中的 #include

构建 utility.dll 时,您需要定义 BUILD_UTILITY_DLL 并保留 BUILD_UTILITY_STATIC 未定义。

构建 utllity.lib(静态库)时,您需要定义 BUILD_UTILITY_STATIC 并保留 BUILD_UTILITY_DLL 未定义。

utility.dll 的用户将保留 BUILD_UTILITY_STATIC 以及 BUILD_UTILITY_DLL 未定义。

utility.lib(静态库)的用户需要定义 BUILD_UTILITY_STATIC 并保留 BUILD_UTILITY_DLL 未定义。

对于 core.dll 和 core.lib,您需要一个类似的文件。

关于c++ - 检查预处理器中的 __declspec 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48350202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com