gpt4 book ai didi

c - 将 __func__ 视为字符串文字而不是预定义的标识符

转载 作者:太空狗 更新时间:2023-10-29 16:33:38 24 4
gpt4 key购买 nike

我正在使用 gcc 编译 C99 代码。我想编写一个宏,它将返回一个包含函数名称和行号的字符串。

这是我的:

#define INFO_MSG  __FILE__ ":"__func__"()"

但是,当我编译试图使用这个字符串的代码时,例如:

char buff[256] = {'\0'}
sprintf(buff, "Something bad happened here: %s, at line: %d", INFO_MSG, __LINE__);
printf("INFO: %s\n", buff);

我收到以下错误消息:

error: expected ‘)’ before ‘__func__’

我已将问题追溯到宏。当我从宏中删除 __func__ 时,代码编译正确。

如何修复宏,以便我可以在我的字符串中包含预定义的 __func__ 宏?

最佳答案

从您的评论来看,目标是拥有一个将文件名和函数名(可能还有行号)组合成一个字符串的宏,该字符串可以作为参数传递给 printf() 等函数strcpy()syslog()

不幸的是,我认为这是不可能的。

C11 标准说:

ISO/IEC 9899:2011 §6.4.2.2 Predefined identifiers

¶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";

appeared, where function-name is the name of the lexically-enclosing function.

因此,与__FILE____LINE__ 不同,__func__ 不是宏。

相关问题What's the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__?涵盖一些替代名称。这些是特定于 GCC 的扩展,而不是标准名称。此外,GCC 4.8.1 文档说:

These identifiers are not preprocessor macros. In GCC 3.3 and earlier, in C only, __FUNCTION__ and __PRETTY_FUNCTION__ were treated as string literals; they could be used to initialize char arrays, and they could be concatenated with other string literals. GCC 3.4 and later treat them as variables, like __func__. In C++, __FUNCTION__ and __PRETTY_FUNCTION__ have always been variables.

这些不能是预处理器构造的原因很充分。预处理器不知道函数是什么,它正在处理的文本是否在函数范围内,或者封闭函数的名称是什么。它是一个简单的文本处理器,而不是编译器。显然,可以在预处理器中构建如此多的理解(仅用于支持这一功能),但这不是标准所要求的,标准也不应该要求它。

不幸的是,我认为这意味着尝试将 __func__(通过任何拼写)与 __FILE____LINE__ 组合在一个宏中生成单个字符串文字是注定的。

显然,您可以使用标准的两步宏机制将文件名和行号生成为字符串:

#define STR(x) #x
#define STRINGIFY(x) STR(x)

#define FILE_LINE __FILE__ ":" STRINGIFY(__LINE__)

不过,您不能将函数名称作为字符串文字的一部分放入其中。

有论据认为文件名和行号足以确定问题出在哪里;函数名称几乎不是必需的。它的外观多于功能,对程序员有一点帮助,但对其他用户没有帮助。

关于c - 将 __func__ 视为字符串文字而不是预定义的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18298829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com