2016-09-05 7 views
4

スペース、タブまたは "\ n"で区切られた2つの文字列リテラルをエラーなしでコンパイルできるのはなぜですか?文字列リテラルのコンパイル

int main() 
{ 
    char * a = "aaaa" "bbbb"; 
} 

は "AAAAは​​" CHAR * "BBBB" は文字である*

2つの文字列リテラルを処理するためには特定の連結ルールはありません。そして明らかに次のコードはコンパイル時にエラーを出します:

#include <iostream> 
int main() 
{ 
    char * a = "aaaa"; 
    char * b = "bbbb"; 
    std::cout << a b; 
} 

この連結はすべてのコンパイラに共通ですか? 「aaaa」のヌル終了はどこでですか? 「aaaabbbb」はRAMの連続ブロックですか?

+5

これらはポインタではなくchar配列です –

答えて

9

たとえば、フェーズ6でthis translation phase referenceを実行します。

隣接する文字列リテラルが連結されています。

これはまさにここで起こります。 2つの隣接する文字列リテラルがあり、それらが連結されて1つの文字列リテラルになります。

これは標準的な動作です。

注意したように、ポインタ変数は2つではなく、文字列リテラルでのみ機能します。

2

並行して配置された文字列リテラルは、変換フェーズ6(プリプロセッサの後)で連結されます。つまり、"Hello," " world!"は(単一の)文字列"Hello, world!"を生成します。 2つの文字列が同じエンコーディングプレフィックスを持つ場合(またはどちらもない場合)、結果の文字列は同じエンコーディングプレフィックス(またはプレフィックスなし)を持ちます。構文解析の前にコンパイルのいくつかのステップでは、この声明の中で

source

5

char * a = "aaaa" "bbbb"; 

コンパイラはリテラルとして隣接する文字列リテラルを検討します。

ので、コンパイラは上記のステートメントは、唯一1つの文字列リテラル"aaaabbbb"

4

隣接する文字列リテラルは、C(およびC++)のルールに従って連結されているコンパイラの格納ある

char * a = "aaaabbbb"; 

と等価です標準。しかし、隣接する識別子(すなわち、変数aおよびb)にはそのような規則は存在しません。引用する

、C++ 14(N3797ドラフト)は、2.14.5を§:翻訳フェーズ6(2.2)において

、隣接する文字列リテラルは連結 あります。両方の文字列リテラルのエンコード接頭辞が同じ場合、 結果の連結文字列リテラルはそのエンコード接頭辞を持ちます。 1つの文字列リテラルにエンコードプレフィックスがない場合は、他のオペランドと同じエンコーディングプレフィックスのリテラル文字列 として扱われます。UTF-8 文字列リテラルトークンがワイド文字列リテラルトークンに隣接する場合、 プログラムが不正です。その他の連結は、 が条件付きでサポートされ、実装定義の動作をします。

3

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

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

は、と等価である:

"Some text...and more text" 

歴史的な理由のためにその:計算がまだによって支配されたとき

元のC言語は1969年から1972年に設計されました80カラムパンチカード。その設計者は、ASR-33 Teletypeのような80列デバイスを使用しました。これらのデバイスはテキストを自動的にラップしなかったため、ソースコードを80列以内に維持するという大きなインセンティブがありました。 FortranとCobolは、最終的に自由形式に移行する前に、明示的な継続メカニズムを持っていました。

文法にあいまいさがなく、長いASCII文字列をコンパイラに連結させるという簡単な方法で80列に収めることができたことは、Dennis Ritchieにとっては驚異的なストロークでした。隣接するリテラル文字列。無数のCプログラマは、その小さな機能に感謝していました。

機能がインストールされたら、どうして削除されるのですか?それは悲しみを引き起こさず、頻繁に便利です。私はもっ​​と多くの言語がそれを持っていればいいと思います。現代のトレンドは、3重引用符やその他の記号で文字列を拡張することですが、C言語でのこの機能の単純さは、これまでにはあまり凌駕されていません。

Similar question here

+1

どこから引用しましたか? – anatolyg

+0

@anatolyg追加された参照 –

関連する問題