我在哪里为dll导出创建预处理程序指令?

时间:2013-09-24 03:56:53

标签: c++ dll export preprocessor-directive

我正在创建一个要在vb.net中导入的c ++ dll。

我发现在dll的头文件中组织导入和导出的最佳方法是以下类型:

#ifndef MY_DLL_EXPORTS
    #define MY_DLL_EXPORT __declspec(dllexport)
#else
    #define MY_DLL_EXPORT __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C"
{
#endif

    MY_DLL_EXPORT BOOL my_function(uint32_t x);

#ifdef __cplusplus
}
#endif

我的问题是,应该在哪里定义__cplusplus和MY_DLL_EXPORTS?

我之前没有这样做,我似乎无法在代码中找到它的位置。我读了一些关于将这些定义放在

中的内容
Project Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions

我是否将它们放在DLL的项目属性中?如果我这样做,在使用这个DLL时,它们是否总是被定义,所以if语句总是会转到dllimport

此外,__cplusplus已经定义了,还是我必须定义它?

2 个答案:

答案 0 :(得分:1)

定义COMPILING_DLL的最佳位置是编译器的命令行。如果您使用Visual Studio IDE,则它位于项目属性... C / C ++ ...预处理器...预处理器定义。

__ declspec(dllimport)是Microsoft特有的C ++扩展。 Microsoft拥有出色的在线文档。

答案 1 :(得分:1)

__cplusplus是由C ++编译器为您定义的,但不是由C编译器定义的。这是如何确定您的代码是由C或C ++编译器编译的。这就是为什么这用于保护extern "C"结构。 C编译器会省略它(因为它已经发出C链接)。

其他常量可以在编译器的命令行中定义(例如,在您列出的菜单中),也可以在代码中的某处定义:

#define MY_DLL_EXPORTS