8

ユーザーが作成したコードを取得し、そのチャンクをより大きな生成ファイルに埋め込むコードジェネレーターがあります。ユーザーのコードに欠陥がある場合に、基礎となるコンパイラが適切な診断を提供することを望んでいますが、生成されたコードの欠陥がソースに起因するべきではない場合に誤って起因することも望んでいません。

#line lineNum "sourceFile"ユーザー作成コードの各チャンクの先頭にディレクティブを発行するつもりです。ただし、ユーザー提供のコードを離れると、「リセット」して生成されたファイルの実際の行に戻るため#lineの手法について言及しているディレクティブのドキュメントが見つかりません。理想的なソリューションは、C# プリプロセッサのディレクティブに似ています。__LINE____FILE__#line default

自分が書いた行数を追跡し、自分で手動でリセットする必要がありますか? #lineまたは、ユーザーのコードとの関連付けを消去するために渡すことができるリセット ディレクティブまたはセンチネル値のような、より良い方法はありますか?

確かな答えはありませんが、これは以前に提起された可能性があるようです。これとそれを区別するために、C++ 11 で回答の欠如が変わったかどうかを追加で尋ねます。

4

5 に答える 5

7

私が以前に使用した手法は、コード ジェネレーター#がライン ディレクティブをリセットする必要がある場合にライン上で a を出力し、単純な awk スクリプトを使用してファイルを後処理し、それらを正しいライン ディレクティブに変更することです。

#!/bin/awk -f
/^#$/ { printf "#line %d \"%s\"\n", NR+1, FILENAME; next; }
{ print; }
于 2013-02-12T02:25:09.150 に答える
2

はい、出力した行数を追跡する必要があり、出力先のファイルの名前を知る必要があります。指定する行番号は、次の行の行番号であることに注意してください。したがって、これまでに 12 行を記述した場合は#line 14 "filename"、 #line ディレクティブが 13 行目にあり、次の行が 14 行目になるため、出力する必要があります。

との#lineプリプロセッサ ディレクティブに違いはありません。CC++

于 2013-02-12T01:54:49.993 に答える
0

@Novelocrat、

以前にここでこの質問をしたことがありますが、確かな回答は投稿されていませんでしたが、ユーザーコードを指す自動生成コードに行ディレクティブが挿入されていると、自動生成コードの再配置が難しくなることがわかりました。自動生成されたコードとユーザー コードは、エラーを報告するためにコンパイラが見つけられる場所に保持する必要があります。生成されたコードにユーザーコードのファイル名と行番号を単純に挿入する方がよいと考えました。優れたテキスト エディタでは、ファイル名にカーソルを置いてファイル内の行にジャンプするには、数回のキーストロークで済みます。

例: vim でカーソルをファイル名の上に置いて押すg-fと、ファイルが表示:42され、エラーが発生した 42 行目 (たとえば) に移動します。

このビットをここに投稿するだけで、同じ質問を思いついた他の誰かがこの代替案も検討できるようになります.

于 2013-03-29T05:51:24.240 に答える
0

コード ジェネレーターへの入力 "user.code" に次のものが含まれているとします。

int foo () {
   return error1 ();
}

int bar () {
   return error2 ();
}

これを拡張して、基本的に次のように見えるとします。

int foo () {
   return error1 ();
}

int generated_foo () {
   return generated_error1 ();
}

int bar () {
   return error2 ();
}

int generated_bar () {
   return generated_error2 ();
}

あなたがそれを望まないことを除いて。生成されたコードにディレクティブを追加#lineして、エラー/警告がユーザー コードからのものか、自動生成されたコードからのものかをコンパイラ メッセージが示すようにします。ディレクティブは、 (ディレクティブ#lineを含む行ではなく) コードの次の行のソースを示します#line

#line 1 "user.code"
int foo () {
   return error1 ();
}

#line 7 "generated_code.cpp"  // NOTE: This is line #6 of generated_code.cpp
int generated_foo () {
   return generated_error1 ();
}

#line 5 "user.code"
int bar () {
   return error2 ();
}

#line 17 "generated_code.cpp" // NOTE: This is line #16 of generated_code.cpp
int generated_bar () {
   return generated_error2 ();
}
于 2013-02-12T01:56:18.207 に答える
-1

あなたは何を試してみました__LINE____FILE__?それらはあなたの#line指示から取られていると思います(そうでなければ、何がポイントになるでしょうか?)。

(gcc-4.7.2 と clang-3.1 を使用した簡単なテストで、私の予感が確認されました)。

于 2013-02-12T02:02:28.167 に答える