空宏的替代方案 在我的C++头文件中,我有以下内容: #ifdef _DLL #define DLL_API __declspec(dllexport) // Being compiled as a DLL. #else #define DLL_API // Not being compiled as a DLL. #endif

空宏的替代方案 在我的C++头文件中,我有以下内容: #ifdef _DLL #define DLL_API __declspec(dllexport) // Being compiled as a DLL. #else #define DLL_API // Not being compiled as a DLL. #endif,c++,macros,c-preprocessor,C++,Macros,C Preprocessor,后来,我有这样的事情: DLL_API int GetNumber(); 我过于简化了,但这里的基本问题是,如果没有定义,是否有办法让编译器跳过DLL\u API。否 当DLL_API被定义为不包含任何内容的预处理器宏时,预处理器会将DLL_API替换为不包含任何内容,编译器将在那里看不到任何内容。若它对于预处理器是未定义的,那个么预处理器对它不做任何处理。然后编译器会看到它不变,并且会得到关于未知标识符DLLAPI的编译器错误,因为这样的东西不是C++语言的一部分。 像_declspec()

后来,我有这样的事情:

DLL_API int GetNumber();
我过于简化了,但这里的基本问题是,如果没有定义,是否有办法让编译器跳过
DLL\u API

当DLL_API被定义为不包含任何内容的预处理器宏时,预处理器会将DLL_API替换为不包含任何内容,编译器将在那里看不到任何内容。若它对于预处理器是未定义的,那个么预处理器对它不做任何处理。然后编译器会看到它不变,并且会得到关于未知标识符DLLAPI的编译器错误,因为这样的东西不是C++语言的一部分。 像_declspec()这样的属性是特定于平台的扩展,通常会将它们在接口中的用法包装到预处理器宏中。

通常是这样

#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总是转换成有效的东西。

我的版本在Xcode下编译。有什么我遗漏的吗?使用dll的(windows)程序将需要u declspec(dllimport)。实际上,您必须做得更多:您需要每个库的唯一标识符,即dll_B_DLL和良好的形式,你不只是使用WIN32的情况下,你实际上是在Windows上,但做一个静态链接。