Pada menyatukan string literal yang berdekatan

17

C dan C ++ mengkompilasi string string yang berdekatan sebagai string string tunggal. Sebagai contoh ini:

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

setara dengan:

"Some text...and more text"

Dalam bahasa C-family lain seperti C # atau Java, ini adalah kesalahan sintaks (yang baik-baik saja BTW).

Apa alasan / alasan historis mengapa C dan C ++ melakukan hal ini?

sampathsris
sumber

Jawaban:

24

Bahasa C asli dirancang pada tahun 1969-1972 ketika komputasi masih didominasi oleh kartu berlubang 80 kolom. Desainernya menggunakan 80 perangkat kolom seperti ASR-33 Teletype. Perangkat ini tidak secara otomatis membungkus teks, jadi ada insentif nyata untuk menyimpan kode sumber dalam 80 kolom. Fortran dan Cobol memiliki mekanisme kelanjutan yang eksplisit untuk melakukannya, sebelum mereka akhirnya pindah ke format bebas.

Itu adalah kecemerlangan bagi Dennis Ritchie (saya berasumsi) untuk menyadari bahwa tidak ada ambiguitas dalam tata bahasa dan bahwa string ASCII yang panjang dapat dibuat untuk masuk ke dalam 80 kolom dengan cara sederhana untuk membuat kompiler menggabungkan string literal yang berdekatan. Pemrogram C yang tak terhitung jumlahnya berterima kasih atas fitur kecil itu.

Setelah fitur dalam, mengapa itu akan dihapus? Itu tidak menimbulkan kesedihan dan sering berguna. Saya ingin satu bahasa lagi memilikinya. Tren modern adalah untuk memperpanjang string dengan tanda kutip tiga atau simbol lainnya, tetapi kesederhanaan fitur ini dalam C tidak pernah kalah.

david.pfx
sumber
8
Alasan lain adalah memungkinkan perangkaian makro preprosesor yang didefinisikan sebagai string literal, misalnya, #define FOO "foo-value"diikuti kemudian oleh"FOO's value is " FOO "."
Blrfl
3
@ Blrfl: Begitulah. Sangat penting untuk menyadari bahwa penggabungan string terjadi setelah substitusi makro selesai.
david.pfx
7

C tidak memiliki operator penggabung string khusus ( +) seperti C # dan Java. Di C # atau Java, ketika kompiler melihat

"a" + "b"

itu dapat mengkompilasi kode persis seolah-olah

"ab"

ditulis dalam kode sumber. Namun, dalam C, tidak ada sintaksis yang sama mudahnya untuk menggambarkan rangkaian string yang dapat dikenali dan dikompilasi oleh kompiler. Jadi desainer C dekade lalu memilih itu

"a" "b"

akan berarti hal yang persis sama dengan

"ab"

Secara alami C ++ mewarisi konvensi yang sama. Sementara standar C ++ overload perpustakaan +pada std::stringke berarti penggabungan string, compiler tidak berusaha untuk menyatu "a" + "b"karena itu sebenarnya kesalahan (Anda tidak dapat menambahkan dua const char *pointer bersama-sama).

Greg Hewgill
sumber
1
C juga tidak memiliki tipe string spesifik, sebagai gantinya memilih pointer ke karakter dalam memori. Anda tidak dapat menambahkan pointer, dan bahkan jika +entah bagaimana dibuat berarti penggabungan, Anda masih harus menyelesaikan masalah di mana dalam memori string gabungan berjalan.
Blrfl