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,包含条件代码


实际上,这最终会涉及到更多的问题

  • 大多数项目都有多个DLL<代码>生成DLL不起作用。对于您构建的每个DLL,您都需要
    BUILD\u xxx\u DLL
    。假设您有两个DLL,实用程序和核心。以及依赖于两者的应用程序

  • 您可能还需要创建一个静态库

  • 在实用程序库的每个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文件中

    在构建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,包含条件代码


    实际上,这最终会涉及到更多的问题

  • 大多数项目都有多个DLL<代码>生成DLL不起作用。对于您构建的每个DLL,您都需要
    BUILD\u xxx\u DLL
    。假设您有两个DLL,实用程序和核心。以及依赖于两者的应用程序

  • 您可能还需要创建一个静态库

  • 在实用程序库的每个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文件中

    在构建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(导入函数)
    在生成实现文件中,将在包含标头之前定义一个宏(您命名的宏)。 e、 g


    在标题中,如果定义了宏,则模式设置为导出。使用DLL时,不会定义宏并导入函数。

    宏由DLL创建者命名

    • 您需要在导出或导入模式下工作的头文件
    • 将使用C/C++文件创建程序,以构建DLL(导出)
    • 其他C/C++文件将用于调用DLL(导入函数)
    在生成实现文件中,将在包含标头之前定义一个宏(您命名的宏)。 e、 g


    在标题中,如果定义了宏,则模式设置为导出。使用DLL时,宏没有定义,函数被导入。

    <代码> yO-DEXSPEC不是宏,它是VisualC++(兼容)编译器中的一个特殊关键字。使用同一个逻辑来确定某个宏的值。尽管如此,我还是想知道我想要的是什么