web-dev-qa-db-ja.com

隣接する文字列リテラルの連結について

CおよびC++は、隣接する文字列リテラルを単一の文字列リテラルとしてコンパイルします。例えばこれは:

"Some text..." "and more text"

以下と同等です。

"Some text...and more text"

C#やJavaのような他のCファミリ言語では、これは構文エラーです(これは完全に問題ありません)。

CおよびC++がこれを行う根拠/歴史的な理由は何ですか?

17
sampathsris

元のC言語は、1969年から1972年に設計され、コンピューティングが依然として80桁のパンチカードで占められていました。その設計者は、ASR-33 Teletypeなどの80カラムデバイスを使用しました。これらのデバイスはテキストを自動的に折り返すことはなかったため、ソースコードを80列以内に収めるという本当の動機がありました。 FortranとCobolには、最終的にフリーフォーマットに移行する前に、明示的な継続メカニズムがありました。

文法に曖昧さがなく、長いASCII文字列を80列に収めることができる簡単な方法でコンパイラに隣接するリテラル文字列を連結させる無数のCプログラマーがその小さな機能に感謝していた。

機能が導入されたら、なぜ削除されるのですか?それは悲しみを引き起こさず、しばしば便利です。私はもっ​​と多くの言語がそれを持っていることを望みます。現代のトレンドでは、三重引用符またはその他の記号を含む拡張文字列を使用するようになっていますが、Cでのこの機能の単純さはこれまでにありません。

24
david.pfx

Cには特定の文字列連結演算子(+)C#やJavaなど。 C#またはJavaでは、コンパイラが

"a" + "b"

それはまるでコードを正確にコンパイルすることができます

"ab"

ソースコードで書かれました。ただし、Cでは、コンパイラーが認識して事前計算できる文字列の連結を記述するための同様に簡単な構文はありません。数十年前のCの設計者はそれを選びました

"a" "b"

とまったく同じ意味になります

"ab"

当然、C++も同じ規則を継承しています。標準のC++ライブラリは+ オン std::string文字列連結を意味するため、コンパイラーは合体を試みません"a" + "b"これは実際にはエラーであるため(2つ追加することはできませんconst char *一緒にポインター)。

7
Greg Hewgill