【发布时间】:2013-08-20 08:47:16
【问题描述】:
我正在使用 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__ 宏?
【问题讨论】:
-
使用编译器的扩展开关查看吐出的内容。
-
我不相信
__func__是一个宏。也许您可以将INFO_MSG放入格式字符串中?sprintf(buff, "Something bad happened here: %s:%s(), at line: %d", __FILE__, __func__, __LINE__); -
@leppie:你能澄清一下吗? - 扩展器是什么意思?顺便说一句,我正在使用 gcc。
-
@tangrs:
__func__是 C99 (AFAIK) 中的预定义宏。 -
似乎不是 gcc 4.2.1 上的宏。
echo "const char* test() { return __func__; }" | gcc -xc -E -std=c99 -显示const char* test() { return __func__; }。编辑:显然it isn't a macro.