预处理器宏没有替换C ++

时间:2015-09-02 12:29:38

标签: c++ macros

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

#define identifier replacement

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

#define afx_msg         // intentional placeholder

我的问题:

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

3 个答案:

答案 0 :(得分:11)

“Nothing”(无文本)是宏的有效替换文本。它将被预处理器简单地删除(更确切地说,由任何东西替换)。

您使用此类内容的原因有很多。一种是简单地在#ifdef和类似的构造函数中使用宏。

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

#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();

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

答案 1 :(得分:4)

#define bla

只是定义bla

您可以将其与

一起使用
#ifdef bla
...
place some code here
...
#endif

典型用例是#define DEBUG,以便在调试模式下启用特殊代码部分。

从"外部"设置此类事物的另一种方式是:

 g++ -DDEBUG x.cpp

还设置了定义的宏DEBUG。

每个头文件都应该包含:

#ifndef THIS_HEADER_INCLUDE_GUARD
#define THIS_HEADER_INCLUDE_GUARD
...
rest of header file
...
#endif

这只是保护你的头文件(recursivly)读取更多次。

有些可以通过特定于实现的#pragma once来完成。

答案 2 :(得分:1)

  1. 预处理器处理它,删除它并替换为
  2. 可能有多种原因,包括可读性,可移植性,自定义编译器功能等。