【发布时间】:2026-01-24 00:20:08
【问题描述】:
我正在尝试理解一些我继承的代码,但是在谷歌上搜索我的方法时遇到了一些问题,我有一些问题希望你们中的一些人能帮助我。代码如下所示,是一个声明函数的.hpp(c++头文件)。
#ifdef _MSC_VER
#define EXPORT_SYMBOL __declspec(dllexport)
#else
#define EXPORT_SYMBOL
#endif
#ifdef __cplusplus
extern "C" {
#endif
EXPORT_SYMBOL float func(int int_param, float float_param);
#ifdef __cplusplus
}
#endif
我的第一个困惑是
#ifdef _MSC_VER
#define EXPORT_SYMBOL __declspec(dllexport)
#else
#define EXPORT_SYMBOL
#endif
我将其理解为“如果我们是从 Windows 机器编译,请做一些特别的事情”。
- __declspec(dllexport) 究竟是做什么的?
- 为什么我需要 EXPORT_SYMBOL?
其次,我对将标题包装在 extern "C" 语句中的必要性感到困惑。据我所知,头文件正在检查是否定义了 __cplusplus,也就是说,我们是否使用 g++ 进行编译。 extern 块在这里是为了确保如果在一个名为 func.c 而不是 .cpp 文件的文件中找到 func() 然后编译,我不会遇到 g++ 编译器的问题与 gcc。我了解重载,以及 g++ 如何更改函数名称以启用重载。
- 由于我将它包含在一个 .cpp 文件中,因此打算用 g++ 专门编译它,我是否需要 extern "C" 块和 #ifdef 语句?有没有这种情况至关重要?
【问题讨论】:
-
如果我们使用 Visual Studio 编译此代码,请执行 Visual Studio 特定的操作。否则什么都不做。
-
阅读 C++ 名称修饰。以下是关于该主题的 2 个很好的 SO 问题:What is name mangling, and how does it work? 和 questions about name mangling in C++
-
它也应该很容易找出 __declspec(dllexport) 的确切作用,有很多关于它的页面。