如何解决使用没有赋值的“#define FOO”——除了作为包含保护?
我正在尝试了解 Steinberg 的 VST SDK。
这个有什么用:
#define PLUGIN_API
无需在头文件中分配任何值,然后在许多成员函数的声明/定义中出现 PLUGIN_API,例如:
Steinberg::tresult PLUGIN_API initialize (Steinberg::FUnkNown* context) SMTG_OVERRIDE;
Steinberg::tresult PLUGIN_API terminate () SMTG_OVERRIDE;
有人能解释一下吗?到目前为止,我所知道的唯一不分配值的 #define 用法是将其用作包含保护。
先谢谢你!
解决方法
这个有什么用:
#define PLUGIN_API
在这一行中,真的没有。基本上允许编译代码的其他部分,函数声明的其他部分,在那里使用这个宏。如果不将其定义为空,则其他部分代码在编译时可能会出错。
像这样:
Steinberg::tresult PLUGIN_API initialize (Steinberg::FUnknown* context) SMTG_OVERRIDE;
Steinberg::tresult PLUGIN_API terminate () SMTG_OVERRIDE;
当然,所以 PLUGIN_API
扩展为无并且没有用。但是,稍后有人可能会将 Windows 的代码编译为 dll。要使符号在 dll 中可见,必须遍历 所有 函数声明并为其添加适当的说明符:
Steinberg::tresult __declspec(dllexport) initialize (Steinberg::FUnknown* context) SMTG_OVERRIDE;
Steinberg::tresult __declspec(dllexport) terminate () SMTG_OVERRIDE;
或者使用定义就可以:
#if I_AM_COMPILING_ON_WINDOWS_FOR_A_DLL
#define PLUGIN_API __declspec(dllexport)
#else
#define PLUGIN_API /* nothing needed */
// defining PLUGIN_API to be empty,allows code to compile with no additional work
#endif
,
它可以用作其他工具可能使用的注释。
例如,我已经看到它用于代码生成器、绑定生成器、静态分析工具、自动化文档生成器、反射系统、序列化系统等。
它也可以作为用户的普通文档,但这种情况很少见。
,它还使您可以稍后在同一翻译单元中使用 #ifdef PLUGIN_API
... #endif
编写一些条件编译。对于此类 C++ 代码的人类读者来说,它是一个有用的注释。
有关更多解释,请参阅 this C++ reference 和 Stroustrup 的书:Programming in C++.
有关此类预处理的工具示例,请参阅 GNU autoconf 和 GNU automake
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。