3

我创建了一个用于错误跟踪的宏。这是一个简化版本:

#include <stdio.h>

#define ERR(...)                                 \
    printf("error @ %d\n", __LINE__)

int main()
{
    return ERR(1,               /* line 7 */
               2,               /* line 8 */
               3);              /* line 10 */
}

执行时,它会打印:

error @ 10

但是,要将打印的行号与grep输出 ( grep -n ERR test.c) 匹配,我需要ERR字符串 ( line 7) 的行号。

这样的事情甚至可能吗?有任何想法吗?

附加说明:宏应该看起来像一个函数调用(所以我可以这样做return ERR(...);)。编译器是 GCC 版本 4.4.5。可以使用 C99 + GNU 扩展。

4

3 回答 3

3

基于@cwyang 命题,在定义和逗号运算符中使用括号不匹配的宏。

#define ERR (LINEINFO, HANDLEARGS
#define HANDLEARGS(...) __LINE__)
#define LINEINFO printf("error @ %d: ", __LINE_)

return ERR(x,
           y,
           z);

将扩大到

return (printf("error @ %d: ", 5), 7);

与 gcc。

于 2012-11-21T16:39:14.467 回答
2

以下情况如何:

#define VOID_MACRO(...) (void) 0
#define ERR printf("err @ %d\n", __LINE__); VOID_MACRO
于 2012-11-21T14:02:34.753 回答
0

Perhaps this is an option?

#define ERR(line,...)             \
    printf("error @ %d\n", line)

ERR(__LINE__
    blah,
    blah,
    blah);
于 2012-11-21T15:42:36.257 回答