Saya membaca di banyak buku bahwa C adalah bagian dari C ++.
Beberapa buku mengatakan bahwa C adalah bagian dari C ++, kecuali untuk detail kecilnya .
Apa sajakah kasus ketika kode akan dikompilasi dalam C, tetapi bukan C ++?
Jika Anda membandingkan C89
dengan C++
maka di sini adalah beberapa hal
int n;
int n; // ill-formed: n already defined
int a[1];
int (*ap)[] = &a; // ill-formed: a does not have type int[]
int b(a) int a; { } // ill-formed: grammar error
struct A { struct B { int a; } b; int c; };
struct B b; // ill-formed: b has incomplete type (*not* A::B)
auto a; // ill-formed: type-specifier missing
C99 menambahkan banyak kasus lainnya
// ill-formed: invalid syntax
void f(int p[static 100]) { }
// ill-formed: n is not a constant expression
int n = 1;
int an[n];
// ill-formed: fam has incomplete type
struct A { int a; int fam[]; };
// ill-formed: two names for one parameter?
void copy(int *restrict src, int *restrict dst);
typedef;
adalah TU legal di C, tapi tidak di C ++.auto a;
ini valid dalam revisi standar C ++ terbaru.a
?auto x;
tidak valid di revisi terbaru, tapi contohnyaauto x = 0;
adalah. Awalnya saya agak kaget :)Di C,
sizeof('a')
sama dengansizeof(int)
.Di C ++,
sizeof('a')
sama dengansizeof(char)
.sumber
'a'
adalahint
. Dalam C ++,'a'
adalah achar
.C ++ juga memiliki kata kunci baru. Berikut ini adalah kode C yang valid tetapi tidak dapat dikompilasi di bawah C ++:
sumber
Ada banyak hal. Hanya contoh sederhana (ini sudah cukup untuk membuktikan C bukan bagian yang tepat dari C ++):
harus dikompilasi dalam C tetapi tidak dalam C ++.
sumber
int*
.void *
, yang dalam C dapat ditetapkan ke jenis penunjuk apa pun, dan C ++ tidak dapat ditetapkan ke jenis penunjuk lainnya.Dalam C ++, jika Anda menyatakan
struct
,union
, atauenum
, namanya segera dapat diakses tanpa kualifikasi:Di C, ini tidak akan berfungsi, karena tipe yang dideklarasikan tinggal di ruang nama yang berbeda. Jadi, Anda harus menulis:
Perhatikan keberadaan
struct
sana di baris kedua. Anda harus melakukan hal yang sama untukunion
danenum
(menggunakan kata kunci masing-masing), atau menggunakantypedef
trik:Akibatnya, Anda dapat memiliki beberapa jenis yang berbeda dengan nama yang sama di C, karena Anda dapat membedakan:
Namun, di C ++, meskipun Anda dapat memberi awalan
struct
nama dengan kata kuncistruct
setiap kali Anda mereferensikannya, ruang nama tersebut digabungkan, sehingga potongan C di atas tidak valid. Di sisi lain, C ++ secara khusus membuat pengecualian untuk mengizinkan tipe dan typedef untuk tipe itu memiliki nama yang sama (jelas tidak berpengaruh), untuk memungkinkan penggunaantypedef
trik yang tidak diubah dari C.sumber
struct
,union
danenum
) berbagi namespace yang sama. Contoh yang lebih baik adalahstruct foo { ... }; typedef enum { ... } foo;
Ini juga tergantung pada jenis C yang Anda gunakan. Stroustrup membuat C ++ sekompatibel mungkin, dan tidak lebih kompatibel, dengan standar ANSI 1989 dan ISO 1990, dan versi 1995 tidak mengubah apa pun. Komite C mengambil arah yang agak berbeda dengan standar 1999, dan komite C ++ telah mengubah standar C ++ berikutnya (mungkin akan keluar tahun depan atau lebih) untuk menyesuaikan dengan beberapa perubahan.
Stroustrup mencantumkan ketidaksesuaian dengan C90 / C95 dalam Lampiran B.2 dari "The C ++ Programming Language", Edisi Khusus (yang merupakan edisi ke-3 dengan beberapa materi tambahan):
'a'
adalahint
dalam C,char
dalam C ++.Ukuran enum ada
int
di C, tidak harus di C ++.C ++ memiliki
//
komentar hingga akhir baris, C tidak (meskipun itu ekstensi umum).Di C ++,
struct foo {
definisi diletakkanfoo
di namespace global, sedangkan di C harus disebut sebagaistruct foo
. Hal ini memungkinkanstruct
definisi untuk membayangi nama di lingkup luar, dan memiliki beberapa konsekuensi lainnya. Selain itu, C memungkinkan cakupan yang lebih besar untukstruct
definisi, dan memungkinkannya dalam tipe pengembalian dan deklarasi tipe argumen.C ++ lebih fussier tentang tipe secara umum. Ini tidak akan mengizinkan integer ditetapkan ke
enum
, danvoid *
objek tidak dapat ditetapkan ke jenis penunjuk lain tanpa cast. Di C, dimungkinkan untuk menyediakan penginisialisasi yang tumpang tindih (dichar name[5] = "David"
mana C akan membuang karakter nol yang tertinggal).C89 mengizinkan implisit
int
dalam banyak konteks, dan C ++ tidak. Ini berarti bahwa semua fungsi harus dideklarasikan di C ++, sedangkan di C89 sering kali dimungkinkan dengan asumsiint
untuk semua yang berlaku dalam deklarasi fungsi.Di C, dimungkinkan untuk melompat dari luar blok ke dalam menggunakan pernyataan berlabel. Di C ++, ini tidak diperbolehkan jika melewatkan inisialisasi.
C lebih liberal dalam hubungan eksternal. Di C,
const
variabel global secara implisitextern
, dan itu tidak benar di C ++. C memungkinkan objek data global untuk dideklarasikan beberapa kali tanpaextern
, tapi itu tidak benar di C ++.Banyak kata kunci C ++ bukan kata kunci dalam C, atau
#define
d dalam header C standar.Ada juga beberapa fitur C lama yang tidak lagi dianggap sebagai gaya yang baik. Di C, Anda bisa mendeklarasikan fungsi dengan definisi argumen setelah daftar argumen. Di C, deklarasi like
int foo()
berarti yangfoo()
dapat menerima sejumlah jenis argumen apa pun, sedangkan di C ++ setara denganint foo(void)
.Itu sepertinya mencakup semuanya dari Stroustrup.
sumber
Jika Anda menggunakan gcc, Anda dapat menggunakan peringatan
-Wc++-compat
untuk memberi Anda peringatan tentang kode C yang meragukan dalam C ++ dalam beberapa hal. Saat ini digunakan di gcc itu sendiri, dan menjadi jauh lebih baik akhir-akhir ini (mungkin coba versi nightly untuk mendapatkan yang terbaik yang Anda bisa).(Ini tidak hanya menjawab pertanyaan, tetapi orang mungkin menyukainya).
sumber
Satu-satunya perbedaan terbesar yang menurut saya adalah ini adalah file sumber C yang valid:
Perhatikan bahwa saya belum menyatakannya di
foo
mana pun.Selain perbedaan bahasa, C ++ juga membuat beberapa perubahan pada pustaka yang diwarisi dari C, misalnya beberapa fungsi kembali
const char *
daripadachar *
.sumber
s,C,C89,
dan mencatat bahwa ini adalah file sumber C99 yang tidak valid.Lihat juga entri FAQ C ++ .
sumber
Sejumlah jawaban di sini mencakup perbedaan sintaks yang akan menyebabkan compiler C ++ gagal pada kode sumber C89 (atau C99). Namun, ada beberapa perbedaan bahasa halus yang legal di kedua bahasa tetapi akan menghasilkan perilaku yang berbeda. The
sizeof (char)
perbedaan itu Naveen disebutkan adalah salah satu contoh, tapi Tulis program yang akan mencetak "C" jika disusun sebagai (ANSI) C Program, dan "C ++" jika disusun sebagai program C ++ daftar beberapa orang lain.sumber
Kompiler C umumnya mengizinkan pemotongan sudut kecil yang tidak dilakukan C ++. C ++ jauh lebih ketat daripada C. Dan umumnya, beberapa perbedaan ini bergantung pada kompilator. g ++ mengizinkan beberapa hal yang tidak dimiliki kompiler Intel C ++, misalnya. Bahkan kode C yang ditulis dengan cukup baik tidak akan dapat dikompilasi dengan kompiler C ++ modern.
sumber
Anda tidak dapat membandingkan bahasa hanya dengan sintaks. Jika Anda melakukan itu mungkin Anda bisa melihat C sebagai bagian dari C ++. Menurut pendapat saya, fakta bahwa C ++ adalah OO (dan C tidak) sudah cukup untuk mengatakan bahwa C dan C ++ adalah bahasa yang berbeda.
sumber