C++ '#定义AP_模块_声明(类型)类型';在C/C++;

C++ '#定义AP_模块_声明(类型)类型';在C/C++;,c++,c,apache,C++,C,Apache,为什么apache源代码有: #define AP_MODULE_DECLARE(type) type 例如,使用此表单的优点是什么: AP_CORE_DECLARE(void) ap_add_per_dir_conf(server_rec *s, void *dir_config);` vs 谢谢。请注意,这些宏还可以使用其他定义。include/ap_config.h具有以下内容(我添加了一些缩进): 这里,AP\u MODULE\u DECLARE用于添加\u stdcall(指定特定

为什么apache源代码有:

#define AP_MODULE_DECLARE(type) type
例如,使用此表单的优点是什么:

AP_CORE_DECLARE(void) ap_add_per_dir_conf(server_rec *s, void *dir_config);`
vs


谢谢。

请注意,这些宏还可以使用其他定义。include/ap_config.h具有以下内容(我添加了一些缩进):

这里,
AP\u MODULE\u DECLARE
用于添加
\u stdcall
(指定特定调用约定)和/或
\u declspec(dllexport)
(与将函数导出为共享库接口的一部分相关)

请注意,例如,如果定义了
AP\u模块\u声明\u静态
,则不会添加
\u declspec(dllexport)
。我的猜测(可能不完全准确,因为我不熟悉这段代码)是,它与将模块链接为静态库有关,在这种情况下,
\u declspec(dllexport)
没有意义


如果您想知道“dso”在该文件的注释中代表什么,那么它代表动态共享对象。它基本上是一个共享库,尽管Apache似乎保留了术语“共享库”,用于在运行时使用
dlopen(3)

无法加载的东西,谢谢!我试图通过学习C++来阅读C++的源代码。关于这一点,你有什么建议吗?@user1092646:寻找一些看起来有趣的项目,看看是否有什么工作要做。例如,您可以检查bug跟踪器或IRC。我有时做的另一件事是在一些应用程序中挑出一些我通常只是不屑一顾的小错误,并试图找出导致它的原因(要么修复它,要么报告我的发现)。这可以教会你很多。
void ap_add_per_dir_conf(server_rec *s, void *dir_config);
#if !defined(WIN32) || defined(AP_MODULE_DECLARE_STATIC)
...
#  if defined(WIN32)
#    define AP_MODULE_DECLARE(type)            type __stdcall
#  else
#    define AP_MODULE_DECLARE(type)            type
#  endif
...
#else
...
#  define AP_MODULE_DECLARE(type)          __declspec(dllexport) type __stdcall
...
#endif