Haruskah saya berhenti menggunakan istilah C / C ++?

140

Saya mengerti C dan C ++ adalah bahasa yang berbeda tetapi ketika saya belajar C ++ saya selalu diberitahu bahwa C adalah bagian dari C ++ atau C ++ adalah C dengan kelas. Dan itu cukup benar sampai munculnya C ++ x0, C ++ 11 (atau C ++ 11/14/17 modern secara umum). Bahkan (terutama ketika bekerja pada sistem embedded) sangat mungkin untuk menemukan kode yang ditulis dalam C ++ tetapi dengan banyak bagian yang ditulis seluruhnya dalam bahasa C murni. Di sini saya punya beberapa pertanyaan:

  1. Haruskah saya berhenti menggunakan istilah C / C ++?
  2. Jika jawaban ke # 1 adalah ya, bagaimana saya memanggil program yang menggunakan campuran C dan C ++?
  3. Mengingat bahwa keduanya adalah bahasa yang 'berbeda', ada kemungkinan bahwa pada titik tertentu kompiler C ++ berhenti mendukung kode yang ditulis dalam bahasa C (karena c ++ modern menyimpang dari mentalitas C untuk hal-hal dasar seperti pointer, penanganan memori dinamis, dll)
  4. Apakah sekarang ada kolaborasi antara orang-orang yang membuat standar C / C ++ untuk menjaga kompatibilitas
  5. Jika # 4 adalah ya, kolaborasi tersebut dapat berakhir dalam waktu dekat dengan munculnya c ++ modern (11/14/17)

Saya tahu bahwa sudah ada pertanyaan serupa, tetapi saya yakin bahwa banyak orang membagikan pertanyaan ini jadi saya sangat tertarik untuk mendapatkan jawaban yang baik terutama untuk poin-poin yang berkaitan dengan kecenderungan C ++ dalam waktu dekat.

rachach
sumber
35
Dan itu tenang benar sampai munculnya C ++ x0, C ++ 11 Tidak, C89 bukan bagian dari C ++ 98.
35
Should I stop using the term C/C++. Iya. Ini hanya digunakan oleh perekrut dan SDM. Insinyur akan menggunakan istilah Catau C++sebagai bahasa independen. Jika Anda menemukan insinyur yang mencampur istilah, hindari mereka.
Martin York
8
@LokiAstari: benarkah? Saya kira pengembang SQLite adalah SDM, karena mereka tidak memiliki posisi terbuka. Ini adalah pandangan yang sangat membatasi (silakan turunkan jawaban saya seperti yang dilakukan orang lain dalam situasi Anda).
4
@greyfade: Sangat buruk untuk mengasumsikan bahwa siapa pun, di mana saja dapat mengklaim urutan karakter yang umum dilihat. "C / C ++" mungkin nama yang dipilih untuk bahasa tertentu, tetapi itu tidak berarti bahwa penggunaan "C / C ++" mengacu pada bahasa itu, apalagi jika saya menyalin situs web itu dan mengganti "C / C ++" dengan "C ++ 1z" bahwa semua diskusi tentang konsep standar C ++ akan tiba-tiba menggunakan terminologi yang salah. Sederhananya, string "C / C ++" tidak pernah merujuk ke bahasa lelucon bernama "C / C ++" dan tidak akan pernah.
Ben Voigt
32
@ TomDworzanski, stroustrup.com/bs_faq.html#C-is-subset "Dalam pengertian matematika yang ketat, C bukan subset dari C ++ ... Namun, C ++ mendukung setiap teknik pemrograman yang didukung oleh C ... Itu bukan tidak biasa untuk dapat mengubah puluhan ribu baris C ke C-style C ++ dalam beberapa jam. Dengan demikian, C ++ adalah superset dari ANSI C seperti ANSI C adalah superset dari K&R C dan sebanyak ISO C ++ adalah sebuah superset dari C ++ seperti yang ada pada tahun 1985. C yang ditulis dengan baik cenderung juga C ++ legal. Misalnya, setiap contoh dalam Kernighan & Ritchie: "Bahasa Pemrograman C (Edisi 2)" juga merupakan program C ++. "
Ben

Jawaban:

183

C tidak pernah menjadi bagian dari C ++. Contoh paling jelas dari hal ini adalah int new;. Ini benar sejak C89 dan C ++ 98, dan bahasa-bahasa hanya tumbuh lebih jauh satu sama lain ketika standar baru telah keluar.

Haruskah saya berhenti menggunakan istilah C / C ++

Iya

Jika jawaban ke # 1 adalah ya, bagaimana saya memanggil program yang menggunakan campuran C dan C ++?

File sumber ditulis dalam satu bahasa atau yang lain. Suatu program dapat terdiri dari kode dari beberapa bahasa yang bekerja bersama-sama, atau sebuah executable yang dihasilkan dengan menghubungkan berbagai objek yang dikompilasi. Anda akan mengatakan program itu ditulis dalam C dan C ++, "C / C ++" bukan bahasa.

Mengingat keduanya adalah bahasa yang 'berbeda', ada kemungkinan bahwa pada titik tertentu kompiler C ++ berhenti mendukung kode yang ditulis dalam bahasa C

3) Mereka tidak pernah melakukannya. char *a = malloc(10);. C dan C ++ belum pernah sepenuhnya kompatibel setidaknya selama mereka memiliki standar ISO (saya tidak tahu semua detail tentang hari-hari pra-standar). klik tautan atau lihat di bawah untuk file yang baik-baik saja dengan C89 dan lebih tinggi, tetapi tidak valid di bawah standar C ++ apa pun.

4) afaik tidak, kelompok kerja saling menyadari satu sama lain tetapi standar membuat keputusan yang terbaik untuk diri mereka sendiri.

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

Saya selalu merasa perlu menyebutkan bahwa C adalah bagian dari Objective-C.

xhainingx
sumber
59
Objective-C secara khusus dirancang untuk menjadi superset ketat dari C, tanpa sintaks yang bertentangan dan sistem objek yang sepenuhnya ortogonal. Ini diambil sedemikian ekstrim sehingga Anda benar-benar dapat mengambil bagian "Objective" dari "Objective-C" dan mengaitkannya ke bahasa lain, menciptakan misalnya Objective-MODULA-2. Dan yang paling terkenal, Objective-C ++ Apple yang menampilkan dua sistem objek yang sepenuhnya ortogonal, tidak berinteraksi, dan tidak terintegrasi.
Jörg W Mittag
20
@masonwheeler jika OP ingin melihat seperti apa superset C yang sebenarnya.
xhainingx
26
"File sumber ditulis dalam satu bahasa atau yang lain." Katakan itu pada program saya yang secara rapi mengkompilasi sebagai standar C99 dan C ++ 89. Bahasa tidak merupakan bagian dari yang lain, tetapi ada persimpangan dari dua set mereka yang ditargetkan secara luas. Lihat Lua, dkk.
murah hati
28
@ luar biasa saya dapat menulis kode C ++ yang dapat dijalankan melalui javac, tetapi apa gunanya?
xhainingx
22
@munificent Contoh program yang dapat dikompilasi dalam tiga bahasa - C, / bin / sh, dan f77 - adalah entri applin.c ke IOCCC 1986. Menurut definisi Anda, tag C/Fortran/shmasuk akal sekarang ?! ioccc.org/years-spoiler.html#1986 .
Sjoerd
108

Ada memiliki menjadi alasan mengapa hal ini datang bersama-sama begitu sering. Meskipun Anda seharusnya tidak memberi tahu guru C Anda bahwa bahasanya adalah bagian dari C ++, ada beberapa kebenaran di sini. Orang lain sudah mengungkapkan sudut pandang guru Anda. Ini sangat bagus (dan diilustrasikan dengan contoh, dll.). Tapi kita tidak hidup di menara gading, atau buku.

Bos besar Anda tidak peduli tentang bahasa yang Anda gunakan. Jika dia tahu sedikit tentang pemrograman, katakan saja Anda menggunakan C / C ++ dan itu akan terdengar seperti "Saya menggunakan bahasa yang perlu dikompilasi ke kode mesin, dengan DLL dan semua hal yang rumit". Ini adalah bagian "komunikasi eksternal".

Jika Anda membuat perpustakaan yang dapat dihubungkan oleh C dan C ++, Anda pasti ingin menyebutnya pustaka C / C ++. Tentu saja, seseorang akan mengangkat tangan dan bertanya mengapa Anda tidak menyebutnya pustaka C yang kebetulan memiliki pembungkus C ++, dan lagi pula C ++ dapat menautkan ke pustaka C sehingga Anda tidak perlu menyebutkannya sama sekali. Jawab saja: "Ya, Anda benar, ini adalah perpustakaan C / C ++". Ini adalah bagian "komunikasi internal".

Jika Anda membuat analisa leksikal untuk C ++, Anda akan terkejut betapa baiknya kerjanya dengan C. Anda bahkan mungkin tidak perlu memodifikasi semuanya. Ini adalah "jika terlihat seperti bebek, dll." bagian.

Dll

Mayoritas program C yang pernah saya lihat kompilasi (dan bekerja) tanpa modifikasi sebagai kode C ++. Jangan biarkan beberapa pengecualian atau programer dogmatis (betapapun berpengaruh) menipu intuisi Anda. C dan C ++ sangat dekat, dan seringkali kompatibel, dan sering dicampur dan dicocokkan bersama, sehingga istilah C / C ++ digunakan. Ini digunakan karena berguna untuk menggambarkan situasi seperti ini di mana tidak terlalu penting apakah Anda mempertimbangkan C atau C ++, asalkan bukan Java atau PHP . Kita tahu itu "salah", tetapi kita tidak peduli, itu lebih bermanfaat daripada salah.

Mungkin disalahgunakan, mungkin bodoh, tapi tetap saja, saya tidak yakin manfaat apa yang akan Anda dapatkan dengan menjadi lebih bertele-tele daripada yang dibutuhkan dan menolak untuk berkomunikasi dengan cara yang dipahami orang lain. Jika Anda merasa tidak nyaman dalam beberapa situasi tertentu, maka jangan gunakan istilah umum C / C ++, tetapi yang relevan dengan kasus (baik C atau C ++).

Jangan takut dengan masa depan. Sistem operasi kami ditulis dalam C. Cukup banyak C / C ++ produksi perangkat lunak saat ini terjadi di C ++. Pasangan ini akan tinggal sebentar di sini. Tidak ada yang tertarik pada satu yang dibuat lebih tidak kompatibel dengan yang lain (sebenarnya sebaliknya).

Untuk lebih spesifik tentang poin Anda:

1) Itu tergantung. Ya ketika itu dapat menyebabkan kebingungan, ketika Anda merasa tidak nyaman, atau ketika itu salah atau di luar konteks. Tidak ketika Anda merasa sudah cukup.

2) N / A

3) Saya pikir tidak, tapi saya tidak punya bola kristal.

4) tidak tahu

5) Saya tidak berpikir sehingga tidak ada yang mendorong ke arah ini


sumber
7
Komentar dihapus karena mereka semakin berisik.
ChrisF
3
Mengapa ini memiliki begitu banyak upvotes? Itu penuh dengan klaim yang tidak akurat dan salah!
Zaibis
5
@Zaibis apakah Anda akan berbaik hati untuk memperluas klaim mana yang salah atau tidak akurat?
usernumber
3
Mengikuti logika Anda, C / C ++ / Objective-C / Fortran / Pascal harus menjadi ekspresi yang valid tetapi ini terdengar konyol. Masalah dengan istilah C / C ++ adalah bahwa hal itu dapat berarti beberapa hal sehingga Anda tidak memiliki jaminan itu akan memenuhi makna yang diinginkan. Dalam praktik saya, orang biasanya memahaminya sebagai "C hanya versi primitif lama dari C ++" dan ini hanya salah.
martinkunev
4
Di luar validitas intrinsik dari istilah itu, C/C++tidak jelas, dan karenanya tidak berguna. Mengikuti contoh Anda, a C/C++ librarybisa berarti pustaka C dengan pembungkus C ++, atau pustaka C ++ dengan pembungkus C. Atau bisa berarti bahwa perpustakaan terdiri dari beberapa modul, beberapa dikompilasi menggunakan C ++, beberapa dikompilasi dalam C. Ini tidak jelas sama sekali. Bagi saya, mengatakan bahwa perpustakaan dibuat C and C++jauh lebih jelas, atau C library with compatibility with C++juga jauh lebih jelas. Dan di sini ambiguitas ini dengan hanya dua lang, bayangkan menggunakan ini "strategi komunikasi" selama lebih ...
gaborous
43

Melawan arus saya akan mengatakan itu tergantung pada konteksnya .

Istilah "C / C ++" biasanya tidak sesuai ketika mengatakan sesuatu seperti "ini adalah program C / C ++", tetapi ini telah dieksplorasi secara mendalam pada jawaban lain.

Namun, mungkin ada konteks di mana C / C ++ dapat sesuai.

  • Ada berbagai pustaka yang biasanya memiliki API C dan C ++. Saya kira itu tidak jauh dari kebenaran jika Anda menyebutnya perpustakaan C / C ++. Kita manusia suka mengompres informasi, sehingga mengatakan "opencv adalah perpustakaan C / C ++" pendek, jelas, dan dapat dimengerti, bandingkan dengan mengatakan "opencv adalah perpustakaan, yang dikirimkan dengan header baik untuk C dan C ++".
  • Anda dapat berbicara tentang desain bahasa dan sintaksis. Dari sudut pandang sintaks bahasa, Anda mungkin mengatakan bahwa suatu bahasa memiliki sintaks mirip C / C ++.
  • Anda mengatur kontes coding, dan Anda menerima kedua solusi yang ditulis dalam C dan C ++
  • Anda sedang merekrut seorang programmer baru, dan sebagian besar tugasnya adalah C atau C ++, sehingga programmer diharapkan mengetahui kedua bahasa tersebut. Ini umum dalam pengembangan tertanam, di mana C lebih cocok untuk beberapa mikrokontroler (biasanya sangat kecil), dan C ++ untuk yang lain. Dalam hal ini Anda mungkin mengatakan Anda mencari seorang programmer C / C ++.
vsz
sumber
10
Saya melihat bahwa posisi bertentangan dengan konsensus umum di sini di P. SO. (di mana Anda harus mengunggulkan segala sesuatu yang terlihat "gesit / hype / seperti The One And Unique Right Thing" dan mengungguli sisanya) disambut sama seperti biasanya. Kawan, pemrograman bukan agama, dan situs web ini bukan buku suci.
16
Poin-poin terakhir benar-benar menampilkan masalah besar: Apakah Anda mencari (1) bagi seseorang yang knowns baik C atau C ++, (2) orang yang tahu baik C dan C ++ atau (3) orang yang bingung mendengar ini bahasa berbeda. Jangan sampai kolam ketiga tumbuh.
5gon12eder
10
Poin terakhir akan lebih baik dinyatakan sebagai "programmer dengan pengalaman dalam C dan C ++" jika itu yang sebenarnya Anda cari. Iklan pekerjaan berjudul "programmer" yang menurut pengalaman memerlukan daftar judul "C dan C ++" atau "C atau C ++" tidak berbeda secara signifikan dari yang berjudul "programmer" dan mencantumkan "C / C ++" sebagai kualifikasi yang diperlukan, tetapi jauh lebih tepat. Tipe orang yang Anda cari untuk pekerjaan semacam itu mungkin sangat menghargai ketepatan ekspresi itu.
CVn
10
Dalam bahasa tertulis, tanda '/' itu biasanya ditafsirkan sebagai logis or, bukan sebagai logis xor. Jadi itu salah satu atau keduanya. Dalam daftar pekerjaan Anda tahu C atau C ++ atau keduanya. Sekarang, saya merasa banyak orang yang religius dengan istilah ini. Seorang programmer C yang baik akan baik-baik saja mengambil C ++ terlepas dari betapa berbedanya kedua bahasa. Saya mulai coding PHP dan kemudian saya pindah ke Scala (dua bahasa yang sama sekali berbeda) Mengapa seorang programmer C tidak dapat mengambil C ++ atau sebaliknya? Istilah C / C ++ memiliki beberapa kelebihan jika digunakan dalam konteks yang benar.
ILikeTacos
4
Anda juga bisa menggunakan C / C ++ untuk menggambarkan program yang dimaksudkan untuk bekerja ketika dikompilasi sebagai C atau C ++, atau program dengan komponen C dan C ++ yang terpisah.
immibis
30

Secara umum, pengguna SO meminta orang yang mengajukan pertanyaan untuk memilih bahasa: C atau C ++. Mengapa?

Ada banyak perbedaan halus antara C dan C ++. Misalnya, dalam C ++, sebuah constvariabel di lingkup global memiliki hubungan internal kecuali dideklarasikan extern, tetapi di C memiliki hubungan eksternal kecuali dinyatakan static. Dengan mengatakan "C / C ++", OP menegaskan pengetahuan bahwa jawaban untuk pertanyaan mereka adalah sama di C dan C ++, ketika itu sangat baik mungkin tidak. Hal ini tentu saja mempersulit calon penjawab.

  • Terkadang kita dapat melihat bahwa kode tidak valid dalam satu bahasa atau yang lain (misalnya, konversi implisit dari void*ke penunjuk ke objek tidak valid dalam C ++). Ini menyebalkan. Mengapa Anda mengatakan "C / C ++" ketika Anda memiliki sepotong kode yang valid dalam C tetapi tidak C ++? Apakah Anda bermaksud C, atau ini hanya kesalahan dalam kode yang dimaksudkan sebagai C ++?

  • Kadang-kadang jawabannya akan berbeda tergantung pada bahasa (misalnya, array panjang variabel ada di C99 tetapi tidak di C ++). Jika kami tidak tahu bahasa apa yang Anda bicarakan, kami harus menebak, atau menulis jawaban untuk keduanya ketika hanya satu yang benar-benar bermanfaat, karena Anda tahu bahasa apa yang sebenarnya Anda gunakan; Anda hanya tidak memberi tahu kami!

  • Terkadang jawabannya benar-benar sama untuk kedua bahasa, tetapi sulit untuk memastikannya. Sebagai contoh, saya pikir C dan C ++ memiliki aturan konversi integer yang sama, tetapi agar benar-benar yakin, saya harus membaca kedua standar dengan cermat. Sekali lagi, ini membuat saya melakukan pekerjaan dua kali lebih banyak dari yang diperlukan ketika Anda mungkin hanya peduli pada salah satu bahasa.

Bagaimanapun, untuk menjawab pertanyaan Anda yang lain:

  1. Iya.

  2. Jika Anda menautkan kode C dan C ++, Anda dapat menggunakan kedua tag tersebut, tetapi harap sebutkan bahasa masing-masing file.

  3. Terkadang ada perubahan yang dipatahkan, tetapi jarang terjadi dan biasanya berdampak terbatas (jika tidak disetujui). Misalnya, autodalam C ++ 11.

  4. Saya tidak berpikir mereka berkolaborasi secara langsung, tetapi mereka memperhatikan perkembangan dalam bahasa lain dan mencoba menghindari memperkenalkan perubahan yang akan membuat kompatibilitas lebih sulit.

Dan jika Anda benar-benar ingin tahu tentang kedua bahasa itu, tidak apa-apa, dan Anda bisa mengatakan itu dalam pertanyaan Anda. Ketika Anda mengatakan "C / C ++", saya benar-benar tidak yakin apa yang Anda maksud, dan sepertinya Anda membuat asumsi tentang dua bahasa tersebut.

Brian
sumber
7
Saya tahu bahwa ada orang yang menulis kode di persimpangan C dan C ++, dan menggunakan kompiler C ++ untuk typechecking, tetapi kompiler C untuk pembuatan kode. Saya tidak tahu apakah itu masuk akal atau tidak. Namun, ini adalah topik yang muncul setiap beberapa tahun di Linux Kernel Mailinglist, ketika seseorang mengajukan tambalan untuk mengganti nama (sangat penting dalam Unified Object Driver Model Berorientasi Objek Kernel Linux) struct classuntuk sesuatu seperti struct klassuntuk alasan itu, dan kemudian selalu ditembak jatuh oleh Linus.
Jörg W Mittag
3
@ JörgWMittag: Saya belum pernah bertemu orang yang menggunakan "C / C ++" sebagai singkatan untuk "subset umum C dan C ++" dan juga tahu apa yang ia bicarakan. Orang-orang yang sengaja bekerja di subset umum cenderung membuat itu eksplisit dengan tidak menyingkat.
Bart van Ingen Schenau
2
Ini adalah jawaban yang baik secara khusus tentang penggunaan C / C ++ dalam pertanyaan Stack Exchange , bukan pada umumnya.
immibis
@ BartartIngenSchenau Berapa banyak anggota komite std yang Anda temui?
curiousguy
18

Saya selalu diberitahu bahwa C adalah himpunan bagian dari C ++ atau C ++ adalah C dengan kelas. Dan itu tenang benar sampai munculnya C ++ x0, C ++ 11 (atau C ++ 11/14/17 modern secara umum).

C tidak pernah menjadi bagian dari C ++. Misalnya C89 bukan bagian dari C ++ 98.

Beberapa contoh:

  • formulir daftar pengidentifikasi C89 untuk pernyataan parameter fungsi tidak didukung di C ++
  • C89 dan C ++ 98 memiliki tipe berbeda untuk konstanta karakter
  • C89 dan C ++ 98 memiliki tipe berbeda untuk string literal
  • operator logis menghasilkan berbagai jenis dalam C89 dan C ++ 98 ( intvs bool)
  1. Haruskah saya berhenti menggunakan istilah C / C ++?

Iya.

  1. Jika jawaban ke # 1 adalah ya, bagaimana saya memanggil program yang menggunakan campuran C dan C ++?

Suatu program adalah C atau C ++ (jika bahkan beberapa program yang sangat mendasar dapat dikompilasi dengan kompiler C atau C ++). Kompiler apa yang Anda gunakan untuk mengkompilasinya? Itu harus menjawab pertanyaan Anda. Harbison & Steele menciptakan istilah Clean C untuk menunjuk subset umum C dan C ++ tapi saya pikir itu ide yang buruk.

EDIT : Namun saya mengakui bahwa secara teknis Anda dapat menautkan file objek C dan C ++ dalam satu program tetapi OTH ada banyak bahasa yang diizinkan untuk dicampur dalam satu program misalnya Java dan C ++. Saya pikir menggunakan istilah C / C ++ program hanya menambah kebingungan bahwa itu ditulis dalam satu bahasa yang disebut C / C ++.

  1. Mengingat bahwa keduanya adalah bahasa yang 'berbeda', ada kemungkinan bahwa pada titik tertentu kompiler C ++ berhenti mendukung kode yang ditulis dalam bahasa C (karena c ++ modern menyimpang dari mentalitas C untuk hal-hal dasar seperti pointer, penanganan memori dinamis, dll)

Ada banyak fitur (contoh: array panjang variabel, anggota array fleksibel _Generic,, ...) dari C99 atau C11 yang tidak didukung oleh versi C ++.

ouah
sumber
Program multi-bahasa: program yang menggunakan JNI secara luas bisa disebut program C / Java. Fakta bahwa dua bahasa digunakan bersama tidak berarti mereka dikompilasi bersama.
immibis
1
stroustrup.com/bs_faq.html#C-is-subset "Dalam pengertian matematis yang ketat, C bukanlah subset dari C ++ ... Namun, C ++ mendukung setiap teknik pemrograman yang didukung oleh C ... Tidak jarang menjadi mampu mengkonversi puluhan ribu baris C ke C-style C ++ dalam beberapa jam, jadi, C ++ adalah superset dari ANSI C sebagaimana ANSI C adalah superset dari K&R C dan sebanyak ISO C ++ adalah superset dari C ++ seperti yang ada pada tahun 1985. C yang ditulis dengan baik juga cenderung legal C ++. Sebagai contoh, setiap contoh dalam Kernighan & Ritchie: "Bahasa Pemrograman C (Edisi ke-2)" juga merupakan program C ++. "
Ben
@Ben program pertama (hello world) dalam "The C Programming Language (2nd Edition)" menghilangkan jenis kembali utama yang tidak valid dalam C ++.
ouah
1
@ Yah, Sepertinya Profesor Stroustrup melewatkan satu saat itu :-) Catatan yang tidak diperbolehkan di C11 juga :-) Cukup yakin itu diizinkan dalam versi C ++ yang lebih lama.
Ben
4
@ Yah, Itu bukan versi pertama C ++. Buku ini dari tahun 1988 dan pada saat itu tidak ada bahasa yang merupakan standar ISO. Versi C ++ saat ini adalah buku Bjarne Stroustrup tahun 1985.
Ben
17

Beberapa program ditulis dalam campuran C dan C ++

Ini hanya fakta kehidupan. Anda dapat mengkompilasi file objek dari C dan C ++ dan menautkannya bersama. Hasilnya cukup bisa disebut "program C / C ++".

Tapi itu hanya program secara keseluruhan. Bagaimana dengan unit kompilasi individu?

Ada subset dari C yang juga merupakan subset dari C ++

Suatu program (atau unit kompilasi) yang ditulis dalam subset itu akan mengkompilasi dan berperilaku sama di bawah kompiler C dan C ++ yang sesuai. Program atau file seperti itu dapat dengan tepat disebut "program C / C ++" atau "file C / C ++".

Program parsial seperti file header juga dapat digunakan di kedua program C dan C ++. File header seperti itu dapat dengan tepat disebut sebagai header C / C ++.

Mengutip Profesor Bjarne Stroustrup:

Apakah C bagian dari C ++?

Dalam pengertian matematis yang ketat, C bukan bagian dari C ++. Ada program yang valid C tetapi tidak valid C ++ dan bahkan beberapa cara penulisan kode yang memiliki arti berbeda dalam C dan C ++. Namun, C ++ mendukung setiap teknik pemrograman yang didukung oleh C. Setiap program C dapat ditulis pada dasarnya dengan cara yang sama dalam C ++ dengan run-time dan efisiensi ruang yang sama. Bukan hal yang aneh untuk dapat mengubah puluhan ribu baris ANSI C ke C-style C ++ dalam beberapa jam. Dengan demikian, C ++ adalah superset dari ANSI C sebagaimana ANSI C adalah superset dari K&R C dan sebanyak ISO C ++ adalah superset dari C ++ seperti yang ada pada tahun 1985.

Ditulis dengan baik C cenderung legal C ++ juga. Misalnya, setiap contoh di Kernighan & Ritchie: "Bahasa Pemrograman C (Edisi ke-2)" juga merupakan program C ++.

Jadi ya ada yang namanya C / C ++. Ini adalah segala sesuatu yang valid C dan valid C ++.

Pra-prosesor C adalah bagian dari bahasa C. Pra-prosesor C ++ adalah bagian dari bahasa C ++

Anda dapat menulis unit kompilasi yang akan dikompilasi di bawah C atau C ++ dan berbeda . Misalnya, ini mungkin memiliki fungsionalitas dasar yang dikompilasi dalam C tetapi mengambil keuntungan dari pustaka C ++ jika dikompilasi dalam C ++.

Jika program pada dasarnya sama, tetapi dengan fitur tambahan, tidak salah untuk mengatakan itu adalah program yang sama. Itu sama, tetapi juga berbeda.

Kebanyakan programmer C dapat melakukan setidaknya sedikit C ++ dan sebaliknya

Bukanlah tidak masuk akal untuk menyebut orang seperti itu seorang programmer C / C ++. Ya, mereka mungkin spesialisasi dalam satu, tetapi ada orang yang adalah C kompeten atau C ++ programmer yang benar-benar tidak bisa melakukan apa pun dari bahasa lain? Di satu sisi, bukankah mereka semua programmer C / C ++?

Tidak ada yang salah dengan mengatakan "C / C ++". Yang penting sedang dipahami

Bahasa Inggris bukan alat untuk mengekspresikan silogisme . Anda dapat menggunakan bahasa Inggris untuk logika, tetapi hanya adil, dan dengan usaha keras.

Ini karena kata-kata tidak secara alami memiliki makna yang tepat, tetapi lebih merupakan awan samar dari denotasi dan konotasi. Yang penting adalah jika orang mengerti apa yang Anda katakan.

Ben
sumber
5
@ BЈовић Mereka tidak setuju dengan Anda tentang penerimaan sebagian kecil terminologi sehingga Anda menyimpulkan mereka tidak memahami perbedaannya dan tidak kompeten. Itu hal yang sangat tidak masuk akal untuk dikatakan.
Ben
4
@ el.pescado Ya. Anda akan menemukan bahwa orang memang merujuk ke PHP / JavaScript. Kenapa tidak? Intinya adalah untuk dipahami, bukan untuk bermain game dengan kata-kata.
Ben
10
@ BЈовић Anda tidak masuk akal. Mereka tidak "sama sekali berbeda". C ++ adalah bahasa yang jauh lebih besar daripada C, tetapi mencakup hampir semua C di dalamnya. Ada ketidakcocokan yang mencegah C ++ menjadi superset yang tepat tetapi mereka kecil, seperti kata-kata tambahan yang disisihkan, beberapa gips menjadi diperlukan, tetapi itu cukup banyak. Ini hampir superset yang tepat, hanya saja tidak cukup.
Ben
7
@ BЈовић Mungkin Anda tidak mengerti apa yang saya tulis. Mengapa Anda tidak melihat di sini untuk melihat bagaimana dalam setiap kasus dimungkinkan untuk mengadaptasi program C sehingga juga dapat dikompilasi sebagai C ++. david.tribble.com/text/cdiffs.htm#C99-vs-CPP9
Ben
7
@ BЈовић Jika Anda orang yang jago tentang terminologi, Anda harus menyadari bahwa C tidak " fungsional ", melainkan " prosedural " - perbedaan yang mungkin ingin Anda pahami sebelum Anda melemparkan tuduhan ketidakmampuan pada orang lain.
RM
15
  1. Haruskah saya berhenti menggunakan istilah C / C ++?

Benar. Tidak jelas apa yang ingin diungkapkan oleh konstruk ini kecuali, mungkin, kebingungan tentang apa yang C dan C ++ atas nama orang yang menggunakan istilah tersebut.

Karena kebingungan ini merupakan sumber frustrasi yang umum, banyak orang menjadi sangat emosional tentang hal itu dan penampilan istilah itu saja akan menjadi alasan yang cukup bagi mereka untuk menjadi negatif tentang kontribusi Anda. Ini mungkin tampak konyol tetapi tampaknya seperti yang kita miliki.

Saya merekomendasikan bahwa alih-alih berbicara tentang "C / C ++" Anda menggunakan istilah yang benar-benar menjelaskan apa yang Anda maksud.

  • Jika Anda berbicara tentang sesuatu di C yang mungkin atau tidak mungkin juga berlaku untuk C ++, hanya mengatakan C .

    Contoh: Bagaimana seharusnya mainfungsi tersebut dinyatakan dalam C?

    Pada awalnya, sepertinya jawaban untuk C ++ sama: int main()atau int main(int, char**). Tetapi ketika diskusi berlangsung, mungkin relevan untuk menunjukkan bahwa dalam C ++, fungsi tersebut harus dideklarasikan pada lingkup global, yang tidak masuk akal dalam C, karena tidak memiliki namespaces. Di sisi lain, C memungkinkan panggilan mainsecara rekursif sementara C ++ tidak. Di C ++, ada implisit return 0;jika Anda "jatuh" maintetapi dalam C returnpernyataan diperlukan di jalan apa pun. Daftar berjalan dan membuat diskusi lebih sederhana jika Anda membuatnya jelas di muka apa bahasa yang akan dibahas.

  • Jika Anda berbicara tentang sesuatu dalam C ++ yang mungkin atau mungkin juga tidak berlaku untuk C, cukup katakan C ++ .

    Contoh: Apakah malloc()array ed intpada awalnya adalah all-nol di C ++?

    Jawaban singkat untuk C kebetulan sama: tidak. Tetapi ketika jawabannya terus berlanjut, mungkin bermanfaat untuk menunjukkan bahwa dalam C, callocakan menjadi alternatif yang baik sementara di C ++, menggunakan std::vector<int>mungkin merupakan pilihan yang lebih baik di tempat pertama.

  • Jika Anda ingin menunjukkan kesamaan antara C dan C ++, ucapkan C dan C ++ .

    Contoh: Dalam C dan C ++, yang sizeofmerupakan intadalah implementasi didefinisikan dan dapat bervariasi antara compiler dan arsitektur.

    Di sini, kami ingin menunjukkan bahwa C dan C ++ berperilaku dengan cara yang sama. Kami secara eksplisit berbicara tentang kedua bahasa.

Saya sebenarnya menyarankan agar Anda lebih spesifik dan tidak hanya berbicara tentang "C" atau "C ++" tetapi versi yang tepat. Kedua bahasa tersebut berevolusi dan pernyataan tumpul seperti

C ++ mendukung /* … */dan // …berkomentar sementara C hanya mendukung /* … */style.

tidak benar atau salah.

  1. Jika jawaban ke # 1 adalah ya, bagaimana saya memanggil program yang menggunakan campuran C dan C ++?

Karena bahasa memiliki tumpang tindih, setiap program C akan berisi bagian yang mungkin terlihat seperti C ++ dan sebaliknya. Namun demikian, penulis mungkin akan memilih menggunakan kompiler C atau C ++. Jadi katakan “program ini ditulis dalam C ” jika dikompilasi dengan kompiler C dan “program ditulis dalam C ++ ” jika mereka menggunakan kompiler C ++, bahkan jika mereka mungkin menolak untuk menggunakan fitur C ++ modern. Beberapa orang menyebut kode C ++ seperti C-style C ++ . Tidak adanya overloading, pengecualian, polimorfisme, templat dan I / O stream karakteristik umum dari kode tersebut.

Jika, sebaliknya, beberapa file yang ditulis dalam C dan dikompilasi dengan kompiler C dan beberapa lainnya file yang ditulis dalam C ++ dan dikompilasi dengan C ++ compiler, dan kemudian file objek terkait bersama-sama, saya akan mengatakan bahwa “program ini ditulis dalam sebuah campuran C dan C ++ "seperti, pada kenyataannya, Anda sudah melakukannya.

Namun, jika, sebagai gantinya, penulis sangat berhati-hati untuk menulis setiap file sedemikian rupa sehingga dapat dikompilasi dengan kompiler C atau C ++ dan program yang dihasilkan akan melakukan hal yang sama, Anda dapat mengatakan bahwa “program ditulis dalam subset umum dari C dan C ++ ”.

Yang terakhir sering terjadi pada file header yang harus dibagi antara kode C dan C ++. Ngomong-ngomong, menulis kode semacam itu tidak mudah. Jika Anda ingin lebih menekankan bahwa hanya konstruksi seperti yang digunakan yang berlaku di C dan C ++ dan secara luas didukung oleh vendor compiler yang berbeda, istilah yang portabel bagian umum dari C dan C ++ dapat digunakan untuk menekankan ini.

  1. Mengingat keduanya adalah bahasa yang “berbeda”, apakah ada kemungkinan bahwa pada titik tertentu kompiler C ++ berhenti mendukung kode yang ditulis dalam bahasa C (karena C ++ modern menyimpang dari mentalitas C untuk hal-hal dasar seperti pointer, penanganan memori dinamis, dll)?

Saya tidak yakin saya mengerti pertanyaan ini. Karena C dan C ++ adalah bahasa yang berbeda, Anda tidak dapat mengharapkan kompiler untuk salah satu dari mereka menerima program yang ditulis untuk yang lain. Namun, kompiler sering dirancang dengan cara modular dan jika kompiler memiliki C + + front-end , kemungkinan bagus itu juga akan memiliki C front-end. (Anda kemudian akan memilih yang mana dari yang Anda inginkan melalui saklar baris perintah atau cara serupa.) Selama kedua bahasa akan digunakan secara luas, tampaknya sangat tidak mungkin bahwa ini akan berubah. Poin Anda tentang "C ++ modern" Saya pikir pada dasarnya adalah masalah standar pengkodean yang baik dan perpustakaan standar. Dari sudut pandang kompiler , evolusi kedua bahasa agak konvergen daripada menyimpang.

  1. Apakah sekarang ada kolaborasi antara orang-orang yang membuat standar C / C ++ untuk menjaga kompatibilitas?

Iya. Model memori dan pustaka operasi atom yang diperkenalkan dalam C ++ 11 dan C11 adalah contoh yang baik. Tampaknya para perancang kedua bahasa menyadari bahwa kompatibilitas itu penting dan berupaya meningkatkannya. Secara pribadi, saya berharap kolaborasi ini lebih intens dan dua kelompok kerja ISO bahkan mungkin bergabung, tetapi keinginan saya tidak penting.

Bjarne Stroustrup berbicara tentang perbedaan dan kesamaan antara berbagai versi C dan C ++ di § 44,3 dari edisi ke 4 Bahasa Pemrograman C ++ yang, ironisnya, berjudul "C / C ++ Kompatibilitas". Penggunaan istilah ini mungkin sebenarnya sesuai untuk kasus ini karena jelas apa yang dimaksud.

  1. Jika # 4 adalah ya, kolaborasi tersebut dapat berakhir dalam waktu dekat dengan munculnya C ++ modern (11/14/17)

Seperti dibahas di atas, itu terjadi di C ++ 11 dan diharapkan / diharapkan / perlu terjadi lagi.

5gon12eder
sumber
Bagaimana bisa itu tidak benar atau salah?
JDługosz
4
Itu tidak memiliki nilai kebenaran yang terdefinisi dengan baik seperti halnya dengan pernyataan bahwa "hal-hal hijau itu mahal". Untuk kombinasi tertentu dari versi C dan C ++ itu benar, untuk yang lain itu salah.
5gon12eder
5

C / C ++ adalah persimpangan C dan C ++.

int new;bukan C / C ++, dan tidak juga vector<int> foo;.

Demikian pula, C89 / C99 adalah persimpangan dari dua bahasa ini, di mana tidak ada enum bool { false, true };atau for(int i = 0;;)diizinkan.

Dan C ++ 11 / C ++ 14, dll.

Dimungkinkan untuk menulis kode yang mengkompilasi (dan berjalan dengan benar) di bawah C ++ 11 dan C ++ 14, walaupun kompilasi di bawah satu tidak berarti mengkompilasi di bawah yang lain. Faktanya, banyak orang melakukan ini.

Dan banyak orang menulis kode yang bekerja di C dan C ++.

Jelas, semakin besar tumpang tindih, semakin masuk akal; Saya tidak berharap melihat pertanyaan tentang kode C / C ++ / Java.


Meskipun "masuk akal" untuk berbicara tentang subset umum dari bahasa-bahasa ini, banyak pertanyaan tidak akan memiliki jawaban dalam subset ini, misalnya Apa yang seharusnya main () kembali dalam C dan C ++?

Tetapi Anda dapat berbicara tentang kode yang berfungsi untuk spesifikasi berbagai bahasa, apakah spesifikasi itu dibedakan berdasarkan "versi" atau "nama bahasa" atau sebaliknya.

Paul Draper
sumber
3

Ini adalah semacam tanggapan terhadap posisi bahwa "ini adalah kode untuk programmer yang bekerja dekat dengan logam dan tidak apa-apa dalam konteks manajemen" terlihat dalam beberapa jawaban dan komentar lainnya.


Saya berpendapat bahwa bahkan interpretasi itu harus dijaga dengan hati-hati.

Dimulai paling tidak pertengahan tahun 90-an jika Anda menginginkan seorang programmer C ++ dan seseorang yang menggambarkan diri mereka sebagai seorang programmer C yang diterapkan, Anda harus bertanya seberapa banyak mereka tahu tentang desain berorientasi objek, berapa banyak pengalaman yang mereka miliki dengan debugging pada suatu objek konteks yang berorientasi, dan tentang kemampuan mereka untuk menggunakan perpustakaan templat. Anda ingin menyelidiki dengan tepat masalah-masalah tersebut selama wawancara dan proses perekrutan.

Di sisi lain, sekarang sudah lebih dari satu dekade sejak guru C ++ mulai mendorong "C ++ modern" yang berarti penekanan pada perpindahan dari pointer kosong ke objek pointer yang lebih aman dan idiom berbasis iterator. Dengan munculnya C ++ 11 sekarang ada dukungan eksplisit untuk pemrograman multi-paradigma dan dorongan menuju kode yang tidak menunjukkan bare pointer sangat kuat. Apa artinya itu adalah bahwa jika saya mewawancarai seorang programmer C ++ untuk posisi C hari ini, saya akan sangat khawatir untuk memeriksa seberapa akrab orang ini dengan pointer aktual yang diaktifkan penembakan kaki.

Saya tidak berada dalam bisnis akhir-akhir ini (bahkan ketika saya masih berada di Stack Overflow saat masih bayi), jadi saya tidak akan berani menebak seberapa sering orang yang diwawancarai khayalan tidak memiliki keterampilan cross-over, tetapi Saya pikir seperti yang paling sering diterapkan bahasa sekarang memang sangat berbeda.

Singkatnya "C / C ++" harus dijatuhkan tidak hanya dalam konteks teknis tetapi dalam sebagian besar konteks bisnis juga.

dmckee
sumber
Cara yang baik untuk menunjukkan bahwa ambiguitas apakah itu berarti "C atau C ++, siapa yang tahu", "C dan C ++, dihubungkan bersama", "C dan C ++, persimpangan", atau "C atau C ++, siapa yang peduli" semakin tidak bisa dibenarkan, bahkan di mana orang bisa lolos entah bagaimana.
Deduplicator
2

Jawaban paling sederhana untuk pertanyaan ini adalah Anda seharusnya tidak menggunakan istilah itu. Itu adalah istilah yang seharusnya tidak ada. Tidak ada artinya. Setiap program adalah C, atau C ++.

Dan itu tenang benar sampai munculnya C ++ x0, C ++ 11 (atau C ++ 11/14/17 modern secara umum).

C ++ 98 dan 03 bahkan bukan C jarak jauh dengan Kelas. Siapa pun yang mengajarimu ini tidak tahu apa-apa dan kau bisa melupakannya. Ini tidak pernah benar.

DeadMG
sumber
Ini tidak sepenuhnya benar. Ada suatu waktu suatu halaman yang menggambarkan spesifikasi bahasa yang diusulkan untuk bahasa yang disebut "C / C ++" yang, antara lain, menentukan (hampir) tidak adanya sistem tipe. Sayangnya, halaman tersebut telah dihapus, dan situs yang menjadi tuan rumah sejak itu telah memasang robots.txt yang menghapus salinan yang diarsipkan dari archive.org.
greyfade
1
Aha, saya sudah menemukan salinan di archive.is: Rationale , Syntax and Semantics .
greyfade
5
"Setiap program adalah C, atau C ++." Saya tidak setuju. Sangat umum untuk mengambil program C, dan port ke C ++ satu file pada suatu waktu (dengan mengubah opsi kompiler untuk satu file itu). Beberapa file mungkin tidak pernah porting dan tetap C selamanya. Program semacam itu ditulis dalam C dan C ++
nikie
Tidak juga. Program itu terdiri dari subprogram, yang masing-masing adalah C atau C ++. Setiap TU, yang merupakan keseluruhan program sejauh yang berkaitan dengan kompiler, dikompilasi sebagai C atau C ++.
DeadMG
3
Ini bukan kasus bahwa "Setiap program adalah C, atau C ++". Prof. Bjarne Stroustrup mengatakan: 'C yang ditulis dengan baik juga cenderung legal C ++. Misalnya, setiap contoh di Kernighan & Ritchie: "Bahasa Pemrograman C (Edisi ke-2)" juga merupakan program C ++. ' stroustrup.com/bs_faq.html#C-is-sset
Ben
1

Secara konseptual, seharusnya tidak ada kesulitan khusus dalam mendesain file sumber C sehingga mereka juga dapat dikompilasi apa adanya dengan C ++. Memang ada beberapa keuntungan signifikan untuk melakukan ini. Misalnya, ketika menulis kode untuk sistem tertanam, terkadang bermanfaat untuk dapat menguji kode pada lingkungan PC yang dihosting. Jika kode dikompilasi dengan bersih sebagai C ++, dimungkinkan untuk memiliki pernyataan seperti "MOTOR_ENABLE = 1;" menulis ke bit I / O yang mudah menguap pada sistem embedded (dikompilasi sebagai C), tetapi memicu logika emulasi pada PC (dikompilasi sebagai C ++). Mungkin juga akan mungkin untuk mendesain tipe C ++ pada PC yang akan berperilaku seperti yang dilakukan uint16_t pada sistem embedded yang lebih kecil (sehingga misalnya u16 x=65533;, kompiler harus memperhatikan nilai darix*xsebagai sembilan, daripada memiliki pemerintahan bebas untuk melakukan apa pun yang diinginkannya), meskipun belum ada emulator saya yang memasukkan itu [sebagian karena kompiler C ++ yang saya gunakan belum melakukan hal yang aneh dalam kasus seperti itu].

Sayangnya, pemrogram C dan pemrogram C ++ memiliki antipati yang cukup terhadap satu sama lain sehingga bahasa, selama bertahun-tahun, berevolusi dengan cara yang kompatibel. Sementara C89 berusaha untuk mengadaptasi beberapa fitur yang lebih berguna dari C ++ (seperti prototipe fungsi) suatu sikap tampaknya telah muncul bahwa programmer yang menginginkan salah satu fitur C ++ harus menggunakan C ++, mengabaikan fakta bahwa ada banyak situasi di mana ia akan akan membantu untuk dapat menggunakan beberapa fitur C ++ (mis. kemampuan untuk membebani fungsi dengan tautan inline statis atau statis tanpa harus menerima biaya yang terkait dengan fitur lain yang tidak diperlukan seseorang (mis. nama mangling yang terkait dengan ekspor) fungsi kelebihan beban).

Sementara persimpangan C89 dan C ++ 98 adalah bahasa yang bisa dikerjakan, superset yang dapat digunakan dari versi C yang lebih baru dengan versi C ++ yang lebih baru mungkin menyusut daripada tumbuh (berkat hal-hal seperti Aturan Keterbatasan Mengasingkan) dan tren mendukung yang selalu ada. meningkatkan celah.

supercat
sumber
1
Apa itu "C ++ 95"? Laporan teknis?
Ben Voigt
1
Jika Anda ingin overloading untuk fungsi internal Anda tetapi tidak ada nama mangling untuk eksternal Anda, Anda bisa menempatkan yang pertama menjadi anonim namespacedan mendeklarasikan yang terakhir sebagai extern "C", kemudian gunakan kompiler C ++.
5gon12eder
@ BenVoigt: Mea culpa. Aku seharusnya mencarinya. Versi C ++ sebelum C99. Ketika C89 keluar, ia mencoba untuk membuat C lebih seperti C ++, tetapi C99 menambahkan sejumlah fitur yang C ++ jelas tidak tertarik (misalnya array panjang variabel). Saya tidak banyak memprogram dalam C ++, tetapi saya pikir beberapa fitur C ++ lebih akan membantu C lebih banyak daripada fitur-fitur yang berbeda yang telah membantunya.
supercat
@ 5gon12eder: Saya belum pernah mencoba menghubungkan kode C ++ ke proyek C. Apakah benar-benar sesederhana membuat semuanya statis / inline extern "C"atau apakah ada komplikasi lain juga (misalnya inisialisasi objek statis, dll.)? Apakah ada cara di C ++ untuk membuatnya sehingga foo(1234)akan memanggil foo_const(1234)makro sementara foo(x)[di mana xbukan konstanta] akan memanggil foo_var(x)fungsi? Ada banyak situasi dalam kode tertanam di mana mungkin masuk akal untuk "fungsi" seperti SET_PORT(port, state)memiliki tiga bentuk berdasarkan apakah port dan state keduanya ...
supercat
... mengkompilasi konstanta waktu, port konstan tetapi state tidak, atau port atau state adalah konstanta. Apakah ada cara untuk mencapai itu dengan menggunakan template atau mekanisme C ++ standar lainnya, atau apakah hanya mungkin pada kompiler dengan ekstensi gcc?
supercat