1

LINEマクロを介して報告されたオンラインの文字列全体を取得することは可能ですか? サンプルコード:

#include <stdio.h>

#define LOG(lvl) pLog(lvl, __LINE__, __FILE__)

pLog(const char *str, int line, const char *file)
{
    printf("Line [%u]: File [%s]", line, file);
}

int main ()
{
    LOG("Hello"
            "world");
    return 0;
}

出力は次のとおりです。 行 [13]: ファイル [macro.c]

今、大規模なコードベースで、このファイルを検索し、報告された行にある文字列「Hello world」を出力したいと考えています(この場合は13です)

私が考えていた1つの方法は、最初にこのファイルを検索して出力ファイルを生成することです gcc -E do grep for pLog を実行し、それらの文字列を保存してから、実際のコードファイルに LOG をgrepし、行番号と一致する行番号を保存しますその結果、インデックスの照合を行い、文字列を出力します。

文字列は複数の行に分散できるため (コードでは、Hello が 1 行にあり、world が別の行にあるように)、それにも注意する必要があります。

それを行うための最良かつ高速な方法は他にありますか、またはgccは行とファイルを実際のコードに変換するオプションを提供します

4

1 に答える 1

1

これはClangで非常に簡単に実行できます。次のコマンドは、ファイルの抽象構文ツリー (AST) をファイルにダンプtest.cしますout

clang -cc1 -ast-dump test.c > out

生成されたファイルの AST を見ると、必要な情報を簡単に見つけることができます。

(StringLiteral 0x1376cd8 <line:12:9, line:13:13> 'char [11]' lvalue "Helloworld")))

Clang は、文字列の最初のトークンの開始 (行:12:9)、文字列の最後のトークンの開始 (行:13:13)、および完全な文字列 ("Helloworld") を提供します。

AST ダンプを解析するか、Clang API を使用して同じ情報を取得できます。AST ダンプ形式は将来変更される可能性が高いため、これが 1 回限りのタスクでない場合は、API を使用します。

もちろん、これはすべて、pLog 自体に文字列を出力しない理由がある場合にのみ意味があります。

于 2012-07-03T14:32:19.803 に答える