私の知る限り、この質問はCとC ++に等しく適用されます
C標準 (ドラフト C99 標準の 5.1.1.2) で指定されている「変換フェーズ」のステップ 6では、隣接する文字列リテラルを単一のリテラルに連結する必要があると述べています。いえ
printf("helloworld.c" ": %d: Hello "
"world\n", 10);
(構文的に) 以下と同等です。
printf("helloworld.c: %d: Hello world\n", 10);
ただし、標準では、コンパイラのどの部分がこれを処理する必要があるかを指定していないようです-プリプロセッサ( cpp
)またはコンパイラ自体である必要があります。一部のオンライン調査によると、この機能は一般にプリプロセッサ (ソース #1、ソース #2など) によって実行されることが期待されており、これは理にかなっています。
ただし、cpp
Linux で実行すると、それcpp
が行われないことが示されます。
eliben@eliben-desktop:~/test$ cat cpptest.c
int a = 5;
"string 1" "string 2"
"string 3"
eliben@eliben-desktop:~/test$ cpp cpptest.c
# 1 "cpptest.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "cpptest.c"
int a = 5;
"string 1" "string 2"
"string 3"
それで、私の質問は次のとおりです。言語のこの機能は、プリプロセッサまたはコンパイラ自体のどこで処理する必要がありますか?
おそらく、唯一の良い答えはありません。経験、既知のコンパイラ、および一般的な優れたエンジニアリング プラクティスに基づくヒューリスティックな回答を歓迎します。
PSなぜ私がこれを気にするのか疑問に思っているなら... PythonベースのCパーサーが文字列リテラルの連結を処理する必要があるか(現時点では処理しない)、またはどちらに任せるかを理解しようとしてcpp
います。その前に実行されることを前提としています。