【发布时间】:2021-08-30 08:29:02
【问题描述】:
C++ 标准有一种将行所在的函数转换为 char 数组的方法,但它没有考虑类限定(不包括函数嵌套的外部类。但是有一堆的编译器扩展,并做其他事情,比如包含函数签名。我想做这样的事情:
#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 中,如果我执行上述操作并在 main 中执行:
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?)的标准化功能,就我所见,它基本上是这样的:
- 在解析代码/文本时检查是否有任何字符串与宏定义之一匹配。
- 如果是,请检查宏的定义是否是宏定义本身。
- 递归执行此操作,直到宏定义本身不是宏定义。
- 如果定义本身不是宏定义,则执行正常的宏扩展
考虑“定义的定义”并不是我真正想要考虑和远离的事情,但我有点需要知道 FUNCTION 宏的事情是否会起作用。另外,我标记了这个 C++,因为这是我正在使用的语言,我不知道预处理器是否与 C 语言完全相同。
【问题讨论】:
-
__FUNCTION__和__func__不是也不能是宏。
标签: c++ c c-preprocessor