如何为多行宏调用获取宏名称__LINE__?

时间:2012-11-21 13:27:25

标签: c gcc macros

我已经为错误跟踪创建了一个宏。 这是一个简化版本:

#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扩展。

3 个答案:

答案 0 :(得分:2)

以下内容如何:

#define VOID_MACRO(...) (void) 0
#define ERR printf("err @ %d\n", __LINE__); VOID_MACRO

答案 1 :(得分:2)

基于@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。

答案 2 :(得分:0)

也许这是一个选择?

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

ERR(__LINE__
    blah,
    blah,
    blah);