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

おそらくこれはオプションですか?

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

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