c - 如何在 C 中标记化和 strize __func__ 宏?

标签 c c-preprocessor

我想用宏来标记化和strize,我们所在的函数的名称,以重载C语言中的函数(使用dlopen())。

我发现 __LINE____FILE__ 有类似的情况,但 __func__ 的情况似乎有点不同...

我尝试过:

#define OVERLOAD2(f) printf("Trying to overload function %s...", #f)
#define OVERLOAD1(f) OVERLOAD2(f)
#define OVERLOAD OVERLOAD1(__func__)

int main() {
    OVERLOAD;
}

使用不同的编译标准(c99、gnu11)进行编译不会改变结果;而不是打印:

Trying to overload function main...

它打印:

Trying to overload function __func__...

如何更正这些宏?

最佳答案

以下是 C11 草案关于 __func__ 的内容:

1 The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name";

如您所见__func__ ,与 __FILE__ 不同和__LINE__ , 不是预处理器宏,因此您无法在预处理阶段对其求值。

但是在您的代码中,您甚至不需要这样做。只需更改

#define OVERLOAD2(f) printf("Trying to overload function %s...", #f)

#define OVERLOAD printf("Trying to overload function %s...", __func__)

正如您在__func__的标准描述中看到的那样,它已经是一个字符串了。无需对其进行字符串化。

<小时/>

如果您需要在编译时将函数名称作为“裸词”,例如隐式#define __FUNC__ myfunc ,你运气不好。

这在标准 C 中是不可能的。GCC 还提供了 __FUNCTION__,但尽管其名称全部大写,GCC 手册却说:

Neither of them is a macro; the preprocessor does not know the name of the current function.

MSVC 提供 __FUNCTION__作为宏,但它被定义为字符串,并且您无法去掉双引号。

解决这个问题的唯一方法是编写自己的预处理器或重新考虑您的方法

关于c - 如何在 C 中标记化和 strize __func__ 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37553321/

相关文章:

C: 在不显式传递 `this` 的情况下调用类方法?

c - 使用 DFS 递归方法优化 "Number of Islands"程序中此行为的根本原因是什么

c - 在冒泡排序中使用第二个for循环

c - 在 FreeType 2 中获取文本边界框的正确方法是什么?

c - 当 infix 或 postfix 遇到 "-"符号时,它似乎给了我随机值

用于选择性替换的 C 宏技巧

c - 使用 C 预处理器生成两个函数

c - C 上的预处理器

c++ - Visual Studio C++ 预处理器定义失败,路径从 "u"开始

c - 要求程序以管理员身份运行