如何在#import指令中使用预处理器宏?

时间:2019-03-04 15:42:06

标签: c-preprocessor

我们公司的主要项目有几个预处理器常数,必须针对不同的客户进行调整。首次编写程序时,仅考虑构建代码的Debug和Release版本就足够了。直到我厌倦了一直重建项目后,我们才可以使用预处理器常量和项目设置为每个客户将其构建到不同的文件夹中。

但是我们的项目需要一个ActiveX DLL,该DLL必须位于特定的文件夹中。 (使ActiveX DLL成为我公司对该项目做出的一系列错误决定中的又一个。)使用以下方法将该DLL#导入代码中:

#ifdef _DEBUG
    #import "..\Debug\CapsHelper.dll" no_namespace
#else
    #import "..\Release\CapsHelper.dll" no_namespace
#endif

我目前正在尝试为名为Algoma的客户构建产品。因此,我想创建一个名为CUSTOMER的预处理器常量,其中将包含“ Alcoma”,然后告诉编译器从名为“ Debug Alcoma”或“ Release Alcoma”的文件夹中导入。我该怎么办?

我尝试过:

#define CUSTOMER Alcoma
#ifdef _DEBUG
#import "..\Debug " #CUSTOMER "\CapsHelper.dll" no_namespace
#else
    #import "..\Release " #CUSTOMER "\CapsHelper.dll" no_namespace
#endif

但是那没有用。如果没有在客户之前输入#,它也无法工作。

1 个答案:

答案 0 :(得分:0)

我想您正在使用MSVC,但尚未对其进行测试。但是应该可以:

#define XSTR(X) #X
#define STR(X)  XSTR(X)

#ifdef _DEBUG
#import STR(..\Debug CUSTOMER\CapsHelper.dll) no_namespace
#else
#import STR(..\Release CUSTOMER\CapsHelper.dll) no_namespace
#endif

您尝试的基本问题(除了标准C / C ++中的事实,#只能在宏扩展内部发生)是#include(我想是{{1 }})将宏扩展其参数,它们将不执行字符串连接。因此,需要将stringify运算符应用于整个字符串。