使用没有赋值的“#define FOO”——除了作为包含保护?

如何解决使用没有赋值的“#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 autoconfGNU automake

有关使用类似技巧的 C++ 软件示例,请参阅 Qt & FLTK

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?