c++ - 无需替换 C++ 的预处理器宏

标签 c++ macros

根据 cplusplus.com,定义宏的语法是:

#define identifier replacement

但是,我有时会偶然发现不包含替换的宏定义。例如在afxwin.h中,有如下预处理器定义:

#define afx_msg         // intentional placeholder

我的问题:

  1. 当使用没有替换的预处理器定义时,在编译时会发生什么?它只是被忽略了吗?例如,行 afx_msg void OnAddButton(); 是否变为 void OnAddButton();
  2. 不替换地使用预处理器的目的是什么?仅仅是为了让代码更清晰吗?

最佳答案

“Nothing”(无文本)是宏的有效替换文本。它会被预处理器简单地删除(更准确地说,什么都不替换)。

使用这样的东西有多种原因。一种是简单地使用 #ifdef 中的宏和类似的构造函数。

另一种是条件编译。一个典型的用例是公共(public) API 和 DLL 导出。在 Windows 上,您需要将函数标记为从 DLL 导出(在构建 DLL 时)或从 DLL 导入(在链接到 DLL 时)。在 ELF 系统上,不需要这样的声明。因此,您会经常在公共(public)库标题中看到这样的代码:

#ifdef _WIN32
  #ifdef BUILDING_MYLIB
     #define MYLIB_API __declspec(dllexport)
  #else
     #define MYLIB_API __declspec(dllimport)
  #endif
#else
  #define MYLIB_API
#endif

void MYLIB_API myApiFunction();

另一个原因可能是代码处理工具。也许你有一个工具可以解析源代码,提取带有特定标记的函数列表。您可以将这样的标记定义为空宏。

关于c++ - 无需替换 C++ 的预处理器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32353202/

相关文章:

c++ - 无法理解c语言宏中的inc/dec运算符行为

C 预处理器宏顺序

C++ 无法让指针工作

c++ - 有没有办法在 Visual C++ 中编写带有变量参数列表的宏?

scala - 如何将Scala宏作为项目分发?

c++ - 如何修复 MSVC++(Microsoft Visual Studio)中与 "macro overloading"相关的可变参数宏相关问题?

c++ - 在 C++ 中自动递增以下宏生成结构中的索引

c++ - 如何检测 C++ 中未分配内存的双重删除或删除?

带有 C++ UnsatisfiedLinkError 的 Android Studio JNI

c++ - 为什么没有返回语句时没有任何编译器错误?