3

ファイルと、その内容を出力したい行 ( __file__, ) があります。__line__そのようなことはプリプロセッサを介して可能ですか?

4

2 に答える 2

2

たぶん、このようなものですか?

#include <stdio.h>

#define DBG(X) printf(__FILE__":%d DBG("#X")\n", __LINE__)

int main ()
{
    DBG(this is a test);
}

これにより、次の出力が生成されます。

test.cc:7 DBG(this is a test)

編集:ソースファイルにアクセスするか、ソースファイルを保存する必要があります。ファイルを保存したら、適切な行を印刷するのは簡単です。一方通行:

#define PROGRAM_PRINT_INIT(X) \
    static ProgramPrint pp = ProgramPrint(X)
#define DBG(X) std::cerr << "[" << pp.name << ":" << X << "]" \
                         << pp.file[X] << std::endl

struct ProgramPrint {
    std::string name;
    std::vector<std::string> file;
    ProgramPrint (const char *filename) : name(filename) {
        std::ifstream in(filename);
        std::string line;
        while (getline(in, line)) file.push_back(line);
    }
};

vectorインデックスはゼロから始まることに注意してくださいDBG()。それに応じて使用してください。

于 2012-08-01T23:03:51.050 に答える
0

ええ、C / C ++はそのために作られていません。しかし、これは、物事をどこまで曲げることができるかを本当に知りたい場合の 1 つの提案です。

test.cpp をコンパイルしてテストしたいとします。コンパイルする前に、ソース コード ファイルの先頭にソース コード行の cstring 配列を追加する必要があります。これは別のファイル test_temp.cpp で行い、配列を TEST_CODE と呼びます。

以下をファイルに入れます: code.awk (これにより、再利用が容易になります)。

BEGIN {
    for (i = 0; i < 128; i++) {
        table = sprintf("%s%c", table, i);
    }
    print("= {\"\"")
}
{
    printf(",\"")
    for(j=1; j<=length($1); j++) {
        c = substr($1,j,1)
        printf("\\x%x", index(table, c) - 1)
    }
    printf("\"\n")
}
END {
    printf("};\n")
}

ASCII 文字の「テーブル」を参照することにより、これは各文字に (16 進数の) ASCII 値を使用します (たとえば、「A」の場合は「\x41」)。ソース コードにある可能性のあるタブなどの場合に備えて、 C/C++ 文字列リテラルでエスケープする必要があります。

コンパイルするには、コマンド ライン (またはメイクファイル) で次のように入力します。

echo "char* TEST_CODE[]" > test_temp.cpp
awk -f code.awk test.cpp >> test_temp.cpp
cat test.cpp >> test_temp.cpp
g++ -o test test_temp.cpp
rm test_temp.cpp

ソース コード ファイルの 80 行目 (1 ベース) を取得する場合は、次のように記述します。

TEST_CODE[80]

これは、プリプロセッサ コマンドの前に行われることに注意してください。これは、配列名をそれぞれ TEST_CODE から変更することにより、複数のファイルとヘッダー ファイルで実行できます。

これには穴がありますが、一般的なケースでは機能します。

注: char* / 文字列リテラル変換が原因で、g++ から A LOT コンパイラ警告が表示される場合がありますが、-w フラグを使用してそれらをオフにすることができます。

于 2012-09-10T01:33:23.907 に答える