空宏的替代品

时间:2010-12-18 18:52:44

标签: c++ macros c-preprocessor

在我的C ++头文件中,我有以下内容:

#ifdef _DLL
#define DLL_API __declspec(dllexport) // Being compiled as a DLL.
#else
#define DLL_API // Not being compiled as a DLL.
#endif

稍后,我有类似的事情:

DLL_API int GetNumber();

我过于简单了,但这里的基本问题是,如果没有定义,是否有办法让编译器跳过DLL_API

2 个答案:

答案 0 :(得分:4)

没有

当DLL_API被定义为不包含任何内容的预处理器宏时,预处理器将DLL_API替换为什么,编译器将不会看到任何内容。如果预处理器未定义,则预处理器不执行任何操作。然后编译器会看到它没有改变,你得到有关未知标识符DLL_API的编译器错误,因为这样的东西不是C ++语言的一部分。

__declspec()之类的属性是特定于平台的扩展,通常将它们在接口中的用法包装到预处理器宏中。

答案 1 :(得分:1)

通常,它是

#ifdef _WIN32
#ifdef _DLL
#define DLL_API __declspec(dllexport) // Being compiled as a DLL.
#else
#define DLL_API __declspec(dllimport) // Not being compiled as a DLL.
#endif
#else
#define DLL_API
#endif

因此它是可移植的,并且DLL_API总是被转换为有效的东西。