宏定义的预处理器宏定义

Preprocessor macro definition of a macro definition

C++ 标准有一种将一行所在的函数转换为 char 数组的方法,但它没有考虑 class 限定条件(不包括外部 classes该函数嵌套在其中。但是有一堆编译器扩展可以做,并且可以做其他事情,例如包含函数签名。我想做这样的事情:

#ifdef VISUAL_STUDIO
#define _FUNCTION_NAME_ __FUNCTION__
#else 
#define _FUNCTION_NAME_ __func__
#endif

大致如此。现在,FUNCTION 本身,或者说 GCC 或其他任何东西上的 PRETTY_FUNCTION,可能本身就是宏。当宏本身遵循宏定义时会发生什么?

#define MY_FIRST_DEFINE 6 + 1
#define MY_SECOND_DEFINE MY_FIRST_DEFINE

在 Visual Studio 中,如果我执行上述操作,并且主要执行以下操作:

MY_SECOND_DEFINE; // Expands correctly, to 6 + 1

如果我把两者的顺序颠倒:

#define MY_SECOND_DEFINE MY_FIRST_DEFINE
#define MY_FIRST_DEFINE 6 + 1

它仍然可以正确扩展到 6 + 1。我什至尝试过三个级别 (MY_THIRD_DEFINE),它们的顺序无关紧要,它始终有效。所以基本上,我每次都可以依靠这个工作吗?它是 C++ 预处理器(还是 C?)的标准化功能,据我所知,它基本上是这样的:

  1. 在解析 code/text 时检查是否有任何字符串与宏定义之一匹配。
  2. 如果是,请检查宏的定义是否是宏定义本身。
  3. 递归执行此操作,直到宏定义本身不是宏定义。
  4. 如果定义本身不是宏定义,则进行正常的宏扩展

考虑 'defines of defines' 并不是我真正想要考虑和远离的事情,但我有点需要知道 FUNCTION 宏是否是去上班。另外,我已经标记了这个 C++,因为那是我正在使用的语言,我不知道预处理器是否与 C 语言完全相同。

can I rely on this working every time?

是的。

Is it a standardised feature of the C++ preprocessor (or is it C?)

两者都有。

it does something like this:

一般来说,基本上,假设是。宏在使用时会扩展。扩展的结果是“重新扫描更多要替换的宏名称”,比方说用一些 special rules.

递归

_开头且大写字母的标识符被保留。您不能在代码中使用 _FUNCTION_NAME_。使用 FUNCTION_NAME。看到 gcc docs on reserved names. You might be interested in how glibc assert.h __ASSERT_FUNCTION 做到了。