Jawaban:
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 contohnya auto x = 0;
adalah. Awalnya saya agak kaget :)
C ++ juga memiliki kata kunci baru. Berikut ini adalah kode C yang valid tetapi tidak dapat dikompilasi di bawah C ++:
int class = 1;
int private = 2;
int public = 3;
int virtual = 4;
Ada banyak hal. Hanya contoh sederhana (ini sudah cukup untuk membuktikan C bukan bagian yang tepat dari C ++):
int* test = malloc(100 * sizeof(int));
harus dikompilasi dalam C tetapi tidak dalam C ++.
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
, atau enum
, namanya segera dapat diakses tanpa kualifikasi:
struct foo { ... };
foo x; // declare variable
Di C, ini tidak akan berfungsi, karena tipe yang dideklarasikan tinggal di ruang nama yang berbeda. Jadi, Anda harus menulis:
struct foo { ... };
struct foo x; // declare variable
Perhatikan keberadaan struct
sana di baris kedua. Anda harus melakukan hal yang sama untuk union
dan enum
(menggunakan kata kunci masing-masing), atau menggunakan typedef
trik:
typedef struct { ... } foo;
foo x; // declare variable
Akibatnya, Anda dapat memiliki beberapa jenis yang berbeda dengan nama yang sama di C, karena Anda dapat membedakan:
struct foo { ... };
typedef enum { ... } foo;
struct foo x;
foo y;
Namun, di C ++, meskipun Anda dapat memberi awalan struct
nama dengan kata kunci struct
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 penggunaan typedef
trik yang tidak diubah dari C.
struct
, union
dan enum
) 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'
adalah int
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 diletakkan foo
di namespace global, sedangkan di C harus disebut sebagai struct foo
. Hal ini memungkinkan struct
definisi untuk membayangi nama di lingkup luar, dan memiliki beberapa konsekuensi lainnya. Selain itu, C memungkinkan cakupan yang lebih besar untuk struct
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
, dan void *
objek tidak dapat ditetapkan ke jenis penunjuk lain tanpa cast. Di C, dimungkinkan untuk menyediakan penginisialisasi yang tumpang tindih (di char 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 asumsi int
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 implisit extern
, dan itu tidak benar di C ++. C memungkinkan objek data global untuk dideklarasikan beberapa kali tanpa extern
, 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 yang foo()
dapat menerima sejumlah jenis argumen apa pun, sedangkan di C ++ setara dengan int foo(void)
.
Itu sepertinya mencakup semuanya dari Stroustrup.
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).
Satu-satunya perbedaan terbesar yang menurut saya adalah ini adalah file sumber C yang valid:
int main()
{
foo();
}
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 *
daripada char *
.
s,C,C89,
dan mencatat bahwa ini adalah file sumber C99 yang tidak valid.
#include <stdio.h>
int new (int n) {
return n/2;
}
int main(void) {
printf("%d\n", new(10));
return 0;
}
Lihat juga entri FAQ C ++ .
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.
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.
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.