C / C ++ terimini kullanmayı bırakmalı mıyım?


140

C ve C ++ 'nın farklı diller olduğunu anlıyorum ama C ++' ı öğrenirken her zaman C 'nin C ++' nın bir alt kümesi olduğu ve C ++ 'nın C sınıfı olduğu söylendi . Ve bu, C ++ x0, C ++ 11 (ya da genel olarak modern C ++ 11/14/17) ortaya çıkana kadar oldukça doğruydu. Aslında (özellikle gömülü sistemler üzerinde çalışırken), C ++ dilinde yazılmış, ancak tamamen saf C dilinde yazılmış birçok parçayla kod bulmak çok muhtemeldir. İşte birkaç sorum var:

  1. C / C ++ terimini kullanmayı bırakmalı mıyım?
  2. # 1 cevabı evet ise, C ve C ++ karışımı kullanan bir programı nasıl çağırırım?
  3. Her ikisinin de 'farklı' dilleri olduğu göz önüne alındığında, bir noktada C ++ derleyicilerinin C dilinde yazılmış kodu desteklemeyi bırakması muhtemeldir (modern c ++, işaretçiler, dinamik bellek kullanımı vb. Gibi temel şeyler için C zihniyetinden ayrılmaktadır).
  4. Şu anda uyumluluğu korumak için C / C ++ standartlarını yapan kişiler arasında herhangi bir işbirliği var mı?
  5. Eğer # 4 ise, bu tür bir işbirliği yakın gelecekte modern c ++ ' nın görünümü ile sona erebilir (11/14/17)

Ben zaten benzer soruların olduğunu biliyorum, ancak birçok insanın bu soruları paylaştığından eminim, bu yüzden özellikle yakın gelecekte C ++ eğilimi ile ilgili olan noktalar için iyi cevaplar almakla çok ilgileniyorum.


35
Ve bu, C ++ x0, C ++ 11 Hayır, C89'un C ++ 98 alt kümesi olmadıkça sessizdi .

35
Should I stop using the term C/C++. Evet. Bu sadece işe alım sahipleri ve İK tarafından kullanılır. Mühendisler terimi Cveya C++bağımsız dilleri kullanacaktır . Terimi karıştıran bir mühendis bulursanız, onlardan kaçının.
Martin York

8
@LokiAstari: gerçekten mi? Bence SQLite geliştiricileri açık pozisyonları olmadığı için İK'dır. Bu inanılmaz derecede kısıtlayıcı bir görüş (lütfen durumunuzdaki diğerlerinin yaptığı gibi cevabımı gidip not edin).

4
@greyfade: Herhangi bir yerdeki herhangi birinin, yaygın olarak görülen bir karakter dizisine hak iddia edebileceğini varsaymak kötü. "C / C ++", belirli bir dil için seçilen ad olabilir, ancak bu, "C / C ++" kullanımının, bu web sitesini kopyalayıp "C / C ++" ile değiştirdiğimden daha fazla, o dili ifade ettiği anlamına gelmez. "C ++ 1z", taslak C ++ standardının tüm tartışmasının aniden yanlış terminoloji kullanacağını söyledi. Basitçe söylemek gerekirse, "C / C ++" dizisi asla "C / C ++" adlı şaka diline göndermedi ve asla olmayacak.
Ben Voigt

32
@TomDworzanski, stroustrup.com/bs_faq.html#C-is-subset "Kesin matematiksel anlamda, C, C ++ 'nın alt kümesi değildir ... Ancak, C ++, C tarafından desteklenen her programlama tekniğini destekler. birkaç saat içinde onbinlerce C satırını C stili C ++ 'ya dönüştürebilmek nadirdir.Bu nedenle, C ++' ın ANSI C'nin bir üst kümesi olduğu gibi, ANSI C'nin de bir K&R C'nin üst kısmı olduğu ve ISO C ++ 'nın olduğu gibi 1985’te olduğu gibi C ++’nın süperseti. İyi yazılmış olan C, aynı zamanda yasal C ++ olma eğilimindedir. Örneğin, Kernighan & Ritchie’deki her örnek: "C Programlama Dili (2. Baskı)" aynı zamanda bir C ++ programıdır. "
Ben

Yanıtlar:


183

C hiçbir zaman bir C ++ alt kümesi olmadı. Bunun en açık örneği int new;. Bu, C89 ve C ++ 98’den beri geçerliydi ve diller birbirinden daha da yeni standartlar çıktıkça daha da büyüdü.

C / C ++ terimini kullanmayı bırakmalı mıyım?

Evet

# 1 cevabı evet ise, C ve C ++ karışımı kullanan bir programı nasıl çağırırım?

Kaynak dosya, bir dilde veya diğerinde yazılmıştır. Bir program, birlikte çalışan birden çok dilden gelen koddan veya farklı derlenmiş nesneleri birbirine bağlayarak üretilen bir yürütülebilir dosyadan oluşabilir. Programın C ve C ++ ile yazılmış olduğunu söylersiniz, "C / C ++" bir dil değildir.

Her ikisinin de 'farklı' dil olduğu göz önüne alındığında, bir noktada C ++ derleyicilerinin C dilinde yazılmış kodu desteklemeyi bırakması olasıdır.

3) Hiç yapmadılar. char *a = malloc(10);. C ve C ++ , en azından ISO standartlarına sahip oldukları sürece hiçbir zaman tam olarak uyumlu hale gelmedi (önceden standartlaştırılmış günlerle ilgili tüm ayrıntıları bilmiyorum). linkleri tıklayın veya C89 ve üstü ile uyumlu ancak herhangi bir C ++ standardında geçerli olmayan bir dosya için aşağıya bakın.

4) hayır, çalışma grupları birbirlerinin farkındalar ancak standartlar kendileri için en uygun kararları veriyor.

/* 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) { }

Hep C belirtmekte yarar var hissetmek olduğunu Objective-C bir alt kümesi.


59
Objective-C, çelişkili bir sözdizimi ve tamamen ortogonal bir nesne sistemi olmadan, C'nin katı bir üst kümesi olarak özel olarak tasarlanmıştır. Bu, gerçekten de “Objective-C” nin “Objective” kısmını alıp başka dillere cıvatalayabileceğiniz, örneğin Objective-MODULA-2'yi yaratabileceğiniz bir uç noktaya götürülür. Ve en ünlüsü olarak, iki tamamen dik, etkileşimli olmayan, entegre olmayan nesne sistemi içeren Apple's Objective-C ++ .
Jörg W Mittag

20
@masonwheeler, OP'nin gerçek bir C süpersetinin neye benzediğini görmek istiyorsa.
xhainingx

26
"Bir kaynak dosyası bir dilde veya diğerinde yazılmıştır." Bunu, hem standart C99 hem de C ++ 89 olarak temiz bir şekilde derleyen programıma söyleyin. Her iki dil de diğerinin alt kümesi değildir, ancak iki grubunun da geniş bir hedefi olan kesişme noktası vardır . Lua ve ark.
munificent

28
@ munificent Ben de çalıştırabilirsiniz C ++ kodunu yazabilirim javac, ama ne anlamı olacak?
xhainingx

22
@munificent Üç dilde derlenebilecek bir program örneği - C, / bin / sh ve f77 - IOCCC 1986'ya applin.c girdisidir. Tanımınıza göre, etiket C/Fortran/shşimdi anlamlıdır ?! ioccc.org/years-spoiler.html#1986 .
Sjoerd

108

Orada var bu terimler sık sık bir araya gelip bir nedeni olmaya. C öğretmenine dilinin C ++ 'nın alt kümesi olduğunu söylememelisin, burada bazı gerçekler var. Diğerleri zaten öğretmeninizin bakış açısını gözler önüne sermiştir. Bu çok hoş (ve örnekler ile gösterildi, vb.). Fakat fildişi bir kulede ya da bir kitapta yaşamıyoruz.

Büyük patronun, kullandığın dili daha az önemsemedi. Programlama hakkında biraz şey biliyorsa, ona sadece C / C ++ kullandığını ve "Makine koduna, DLL'lere ve tüm karmaşık şeylere sahip bir kod kullandım" gibi geleceğini söyle. Bu "dış iletişim" kısmıdır.

Hem C hem de C ++ ile arabirim oluşturabilecek bir kütüphane oluşturursanız, kesinlikle C / C ++ kütüphanesi olarak adlandırmak istersiniz. Tabii ki, birileri yardım edecek ve neden C ++ sargısı olan bir C kütüphanesi olarak adlandırılmadığını soracaktır ve yine de C ++ C kitaplıklarına bağlanabilir, böylece bundan hiç bahsetmenize gerek kalmaz. Sadece cevap verin: "Evet, haklısınız, bu bir C / C ++ kütüphanesidir". Bu "iç iletişim" kısmıdır.

C ++ için sözlüksel bir çözümleyici oluşturursanız, C ile ne kadar iyi çalıştığını görünce şaşıracaksınız. "Ördeğe benziyorsa vs." Bölüm.

Vb.

Gördüğüm C programlarının çoğu C ++ kodu olarak değiştirilmeden derlendi (ve çalışıyor). Birkaç istisna veya dogmatik (ancak etkili) programcıların sezginizi kandırmasına izin vermeyin. C ve C ++ çok yakın ve çok sık uyumludur ve sık sık birlikte karıştırılır ve eşleştirilir, C / C ++ terimi kullanılır. Java ya da PHP olmadığı sürece, C ya da C ++ 'ı göz önünde bulundurmanızın gerçekten önemli olmadığı bu tür durumları tanımlamakta faydalı olduğu için kullanılır . Bunun "yanlış" olduğunu biliyoruz, ama umursamıyoruz, yanlış olmaktan daha faydalı.

Suistimal edilebilir, aptal olabilir, ama yine de, gereğinden fazla bilgiçlik yaparak ne gibi bir kazanç elde edeceğinizden emin değilim ve başkalarının anlayacağı şekilde iletişim kurmayı reddediyorum. Belirli bir durumda huzursuz hissediyorsanız, sadece C / C ++ genel terimini kullanmayın, ancak durumla alakalı olanı kullanın (C veya C ++).

Gelecekten korkma. İşletim sistemlerimiz C dilinde yazılmıştır. C / C ++ yazılım programlarının çoğu C ++ 'ta gerçekleşmektedir. Bu çift bir süre kalmak için burada. Kimse birinden diğerine daha fazla uyumsuzluğa ilgi duymuyor (aslında tam tersi).

Puanlarınız hakkında net olmak için:

1) bağlıdır. Evet, bir karışıklığa yol açabileceği zaman, huzursuz hissettiğinizde ya da sadece yanlış ya da bağlam dışı olduğunda. Yeterli olduğunu düşündüğünde hayır.

2) Yok

3) Hayır sanırım ama kristal topum yok.

4) fikrim yok

5) Hiçbir şey bu yöne iter diye düşünmüyorum


7
Yorumlar gürültülü hale geldikçe kaldırıldı.
ChrisF

3
Neden bu kadar çok öneme sahip? Yanlışlıkla ve yanlış iddialarla dolu!
Zaibis

5
@ Zaibis, hangi iddiaların yanlış veya yanlış olduğunu genişletmek için yeterince nazik misiniz?
sayısı

3
Mantığınızı takiben, C / C ++ / Objective-C / Fortran / Pascal geçerli bir ifade olmalıdır, ancak bu aptalca geliyor. C / C ++ ile ilgili sorun, bunun birkaç anlamı ifade edebilmesidir, bu nedenle istenen anlamı toplayacağının garantisi yoktur. Benim pratiğimde insanlar bunu genellikle "C, C ++ 'ın ilkel bir versiyonudur" olarak anlıyor ve bu yanlış.
martinkunev

4
Terimin içsel geçerliliğinin ötesinde, C/C++net değil ve bu nedenle yararlı değil. Örneklerinizi C/C++ libraryizleyerek, biri C ++ sargılı bir C kitaplığı ya da C sargılı bir C ++ kitaplığı anlamına gelebilir. Ya da kütüphane, bazıları C ++ ile derlenmiş, bazıları C içinde derlenmiş birkaç modülden ibaret olabilir. Bana göre, bir kütüphanenin yapıldığı söylenecek C and C++çok daha açık, ya C library with compatibility with C++da çok daha açık. Ve burada belirsizlik sadece iki
dildedir

43

Akıntıya karşı çıkmak , içeriğe bağlı olduğunu söyleyebilirim .

"C / C ++" terimi genellikle "bu bir C / C ++ programıdır" gibi bir şey söylerken uygun değildir, ancak bu diğer cevaplarda derinlemesine incelenmiştir.

Bununla birlikte, C / C ++ 'ın uygun olabileceği bağlamlar olabilir.

  • Genellikle hem C hem de C ++ API içeren çeşitli kütüphaneler vardır. Sanırım böyle bir şeye C / C ++ kütüphanesi diyorsan, gerçeğinden uzak değil. Biz, bilgileri sıkıştırmayı severiz, "opencv bir C / C ++ kütüphanesidir" demek, kısa, açık ve anlaşılabilirdir, "opencv, hem C hem de C ++ için başlıklarla birlikte gönderilen bir kütüphanedir" ifadesiyle karşılaştırın.
  • Dil tasarımı ve sözdizimi hakkında konuşabilirsiniz. Dil sözdizimi açısından, bir dilin C / C ++ benzeri bir sözdizimine sahip olduğunu söyleyebilirsiniz.
  • Bir kodlama yarışması düzenliyorsunuz ve hem C hem de C ++ ile yazılmış çözümleri kabul ediyorsunuz.
  • Yeni bir programcı tutuyorsunuz ve görevlerin çoğu C veya C ++ olacak, bu nedenle programcının her iki dili de bilmesi bekleniyor. C'nin bazı (genellikle çok küçük) mikrodenetleyiciler için daha uygun olduğu ve diğerleri için ise C ++ 'nın gömülü gelişiminde yaygındır. Bu durumda bir C / C ++ programcısı aradığınızı söyleyebilirsiniz.

10
Genel Kurul mutabakatı karşısındaki pozisyonları, PY’de görüyorum. ("çevik / yutturmaca / The One And Unique Right Thing" gibi görünen her şeyi yükseltmeniz ve gerisini aşağıya çekmeniz gerekir) her zaman olduğu gibi kabul edilir. Çocuklar, programlama bir din değil ve bu web sitesi kutsal bir kitap değil.

16
Son madde noktası aslında büyük bir sorunla sergiliyor: Eğer arıyorsunuz (1) bir kişi için bu bilinenler ya C veya C ++, (2) bilen bir kişi hem C ve C ++ veya (3) karışık bir kişi bunlar duymak farklı diller. Üçüncü havuzun büyümesine yardım etme.
5gon12eder

10
Son madde işareti, eğer gerçekten aradığınız buysa, "C ve C ++ 'da tecrübeli programcı" olarak daha iyi ifade edilir. Gerekli deneyime göre "C ve C ++" veya "C veya C ++" başlıklarını listeleyen "programcı" başlıklı bir iş ilanı, "programcı" başlıklı bir programdan önemli ölçüde farklı değildir ve "C / C ++" 'yı gerekli bir yeterlilik olarak listeler. çok daha kesin. Böyle bir iş için aradığınız kişi tipi, bu ifadenin kesinliğini gerçekten çok iyi anlayabilir.
bir CVn

10
Yazılı dilde '/' genellikle mantıksal ordeğil mantıksal olarak yorumlanır xor. Yani ya biri ya da ikisi. İş listelerinde C veya C ++ veya her ikisini de bilirsiniz. Şimdi, birçok insan terim hakkında dindar olduklarını hissediyorum. Bir iyi C programcısı bağımsız ne kadar farklı hem dillerdir ++ C toplayıp mükemmel iyi olacak. PHP'yi kodlamaya başladım ve sonra Scala'ya geçtim (iki farklı dil) Neden bir C programcısı C ++ veya viceversa'yı alamıyor? C / C ++ terimi, doğru bağlamda kullanıldığında bazı haklara sahiptir.
ILikeTacos 16

4
C / C ++ programını, C veya C ++ olarak derlendiğinde çalışmak üzere tasarlanan bir programı veya ayrı C ve C ++ bileşenlerine sahip bir programı tanımlamak için de kullanabilirsiniz.
immibis

30

Genel olarak, SO kullanıcıları soruyu soran kişiden bir dil seçmesini ister: C veya C ++. Neden?

C ve C ++ arasında birçok ince fark var. Örneğin, C ++ 'da, constglobal kapsamdaki bir değişken bildirilmediği sürece iç bağlantıya sahiptir extern, ancak C'de bildirilmediği sürece dış bağlantıya sahiptir static. "C / C ++" diyerek OP, soruya verilen cevabın hem C hem de C ++ 'da aynı olamayacağına dair bilgiyi iddia ediyor. Bu, gereksiz cevap verenler için işleri zorlaştırır.

  • Bazen, kodun bir dilde veya diğerinde geçerli olmadığını görebiliriz (örneğin, void*işaretçi ile nesneden nesneye örtülü dönüşümler C ++ 'da geçerli değildir). Bu can sıkıcı bir durum. C ++ 'da geçerli olan ancak C ++' da geçerli bir kod parçanız varken neden "C / C ++" diyorsunuz? C niyetinde miydin, yoksa bu sadece C ++ olması gereken koddaki bir hata mı?

  • Bazen cevap, dile bağlı olarak farklılık gösterebilir (örneğin, değişken uzunluklu diziler C99'da bulunur, ancak C ++ dilinde değildir). Hangi dilden bahsettiğimizi bilmiyorsak, ya tahmin etmek zorundayız ya da ikisinin de ne zaman gerçekten yararlı olacağı konusunda bir cevap yazmalıyız, çünkü gerçekte hangi dili kullandığınızı biliyorsunuzdur; Sadece bize söylemiyorsun!

  • Bazen cevap her iki dilde de aynıdır ancak emin olmak zor. Örneğin, C ve C ++ 'ın aynı tamsayı dönüşüm kurallarına sahip olduğunu düşünüyorum, ancak gerçekten, gerçekten emin olmak için her iki standardı da dikkatlice okumak zorundayım. Yine, bu muhtemelen dillerden sadece birini önemsiyorsan, bana iki kat daha fazla iş yapmamı sağlıyor.

Neyse, diğer sorularınızı cevaplamak için:

  1. Evet.

  2. C ve C ++ kodlarını birbirine bağlıyorsanız, her iki etiketi de kullanmak kabul edilebilir, ancak lütfen her dosyanın hangi dilde olduğunu belirtin.

  3. Bazen kırılma değişiklikleri olabilir, ancak nadir görülürler ve genellikle etkileri sınırlıdır (aksi halde onaylanmazlar). Örneğin, autoC ++ 11’de.

  4. Doğrudan işbirliği yaptıklarını sanmıyorum, ancak diğer dildeki gelişmelere dikkat ediyorlar ve uyumluluğu daha da zorlaştıracak değişiklikler yapmaktan kaçınmaya çalışıyorlar.

Ve eğer iki dili de gerçekten bilmek istiyorsanız, sorun değil ve bunu sorunuza söyleyebilirsiniz. "C / C ++" deyince ne demek istediğinizi tam olarak anlayamadım ve iki dil hakkında bir varsayımda bulunmuş gibi görünüyorsunuz.


7
C ve C ++ kesişiminde kod yazan ve typechecking için bir C ++ derleyicisi, ancak kod oluşturma için bir C derleyicisi kullanan insanlar olduğunu biliyorum. Yine de, bunun gerçekten anlamlı olup olmadığı hakkında hiçbir fikrim yok. Ancak, her birkaç yılda bir, Linux Çekirdek Posta Listesinde, biri (Linux Çekirdeğinin Birleşik Nesne Yönelimli Sürücü Modeli'nde çok önemli olan) tam da bu nedenle bir struct classşeyi yeniden adlandırmak için bir yama gönderdiğinde ortaya çıkan bir konudur struct klassve daha sonra Linus tarafından sürekli olarak vurulur.
Jörg W Mittag

3
@ JörgWMittag: "C / C ++" 'yu ​​"C ve C ++' nın ortak alt kümesi" için kısa yol olarak kullanan ve aynı zamanda ne hakkında konuştuğunu bilen hiç kimseyle tanışmadım. Bilerek ortak alt kümede çalışan insanlar, kısaltmayarak bu açıklığa açık davranma eğilimindedir.
Bart van Ingen Schenau

2
Bu, özellikle C / C ++ ' nın Stack Exchange sorularında kullanımı hakkında genel olarak değil, iyi bir cevaptır .
immibis

@BartvanIngenSchenau Kaç tane std komitesi üyesiyle tanıştınız?
curiousguy

18

Her zaman C'nin bir C ++ alt kümesi olduğu ya da C ++ 'nın C sınıfı olduğu söylenirdi. Ve bu, C ++ x0, C ++ 11 (ya da genel olarak modern C ++ 11/14/17) ortaya çıkana kadar sessizdi.

C hiçbir zaman C ++ 'in alt kümesi olmamıştır. Örneğin, C89, C ++ 98'in bir alt kümesi değildir.

Birkaç örnek:

  • işlev parametresi bildirimi için C89 tanımlayıcı listesi formu C ++ 'da desteklenmiyor
  • C89 ve C ++ 98 karakter sabitleri için farklı türleri vardır
  • C89 ve C ++ 98 dize değişmezleri için farklı türleri var
  • mantıksal operatörler, C89 ve C ++ 98'de ( intvs bool) farklı türler verir
  1. C / C ++ terimini kullanmayı bırakmalı mıyım?

Evet.

  1. # 1 cevabı evet ise, C ve C ++ karışımı kullanan bir programı nasıl çağırırım?

Bir program C veya C ++ (eğer çok temel bir program bile bir C veya C ++ derleyicisi ile derlenebilirse). Derlemek için hangi derleyiciyi kullanıyorsunuz? Soruna cevap vermeli. Harbison & Steele , C ve C ++ ortak bir alt kümesini belirlemek için Clean C terimini kullandı, ancak bunun kötü bir fikir olduğunu düşünüyorum.

EDIT : Ancak teknik olarak C ve C ++ nesneleri dosyalarını tek bir programda bağlayabileceğinizi itiraf ediyorum, ancak OTH, örneğin Java ve C ++ gibi tek bir programda karıştırılmasına izin verilen birçok dil var. C / C ++ programını kullanmanın sadece C / C ++ adlı tek bir dilde yazılmış olduğu karmaşasına katkıda bulunduğunu düşünüyorum.

  1. Her ikisinin de 'farklı' dilleri olduğu göz önüne alındığında, bir noktada C ++ derleyicilerinin C dilinde yazılmış kodu desteklemeyi bırakması muhtemeldir (modern c ++, işaretçiler, dinamik bellek kullanımı vb. Gibi temel şeyler için C zihniyetinden ayrılmaktadır).

_GenericC99 veya C11'in C ++ sürümleri tarafından desteklenmeyen birçok özellik (örnek: değişken uzunluk dizisi, esnek dizi üyesi ,, ...) vardır.


Çoklu dil programları: JNI kullanan bir program C / Java programı olarak adlandırılabilir. İki dilin bir arada kullanılması, bir araya getirildikleri anlamına gelmez.
immibis

1
stroustrup.com/bs_faq.html#C-is-subset "Sıkı matematiksel anlamda C, C ++ alt kümesi değildir ... Ancak, C ++, C tarafından desteklenen her programlama tekniğini destekler. birkaç saat içinde onbinlerce C satırını C stili C ++ 'ya dönüştürebilir.Bu nedenle, C ++' ın ANSI C'nin bir üst kümesi olduğu gibi, ANSI C'nin de K&R C'nin bir üst kısmı olduğu ve ISO C ++ 'nın da bir üst üste olduğu C ++ 1985'te olduğu gibi . İyi yazılmış C de yasal C ++ olma eğilimindedir. Örneğin, Kernighan & Ritchie'deki her örnek: "C Programlama Dili (2. Baskı)" aynı zamanda bir C ++ programıdır. "
Ben,

@Ben "C Programlama Dili (2. Baskı)" daki ilk program (merhaba dünya), C ++ 'da geçersiz olan ana dönüş tipini atlar.
ouah

1
@ouah, Görünüşe göre Profesör Stroustrup bir tanesini kaçırdı :-) C11'de de izin verilmeyen bir not :-) C ++ 'un önceki sürümlerinde izin verildiğinden emin.
Ben

4
@ouah, C ++ 'in ilk sürümü değil. Kitap 1988’dendir ve o zamanlar hiçbir dil bir ISO standardı değildi. C ++ 'ın şu anki sürümü Bjarne Stroustrup'un 1985 kitabıydı.
Ben,

17

Bazı programlar C ve C ++ karışımı ile yazılmıştır.

Bu sadece yaşamın bir gerçeğidir. Nesne dosyalarını C ve C ++ 'dan derleyebilir ve bunları birbirine bağlayabilirsiniz. Sonuç oldukça makul bir şekilde "C / C ++ programı" olarak adlandırılabilir.

Ama bu sadece bir bütün olarak program. Bireysel derleme birimleri ne durumda?

C ++ 'nın bir alt kümesi olan bir C altkümesi var.

Bu alt kümede yazılmış bir program (veya derleme ünitesi), C ve C ++ derleyicileri uyarınca aynı şekilde derlenecek ve davranacaktır. Böyle bir program veya dosya haklı olarak "bir C / C ++ programı" veya "bir C / C ++ dosyası" olarak adlandırılabilir.

Başlık dosyası gibi kısmi bir program hem C hem de C ++ programlarında da kullanılabilir. Bu gibi başlık dosyalarına haklı olarak C / C ++ başlıkları denebilir.

Alıntı yapan Profesör Bjarne Stroustrup:

C, C ++ alt kümesi mi?

Kesin matematiksel anlamda C, C ++ 'nın alt kümesi değildir. Geçerli C ++ olan, ancak geçerli olmayan C ++ programları ve hatta C ve C ++ dillerinde farklı anlamlara sahip kod yazma yöntemleri de vardır. Bununla birlikte, C ++, C tarafından desteklenen her programlama tekniğini destekler. Her C programı, aynı çalışma zamanı ve alan verimliliği ile C ++ dilinde aynı şekilde yazılabilir. Birkaç saat içinde, on binlerce ANSI C satırını C stili C ++ 'ya dönüştürmek nadir değildir. Bu nedenle, C ++, ANSI C'nin bir üst kümesidir, ANSI C, bir K&R C'nin üst kümesidir ve ISO C ++, 1985'te olduğu gibi C ++'ın bir üst katıdır.

İyi yazılmış C de yasal C ++ olma eğilimindedir. Örneğin, Kernighan & Ritchie'deki her örnek: "C Programlama Dili (2. Baskı)" aynı zamanda bir C ++ programıdır.

Yani evet , C / C ++ diye bir şey var. Hem geçerli C hem de geçerli C ++ olan herhangi bir şey.

C ön işlemcisi, C dilinin bir parçasıdır. C ++ ön işlemcisi C ++ dilinin bir parçasıdır

C veya C ++ altında derlenecek ve farklı olacak bir derleme birimi yazabilirsiniz . Örneğin, C'de derlenmiş temel fonksiyonlara sahip olabilir, ancak C ++ 'da derlenmişse bir C ++ kütüphanesinden yararlanın.

Program aslında aynıysa, ancak ek özelliklere sahipse, aynı program olduğunu söylemek yanlış olmaz . Aynı, aynı zamanda farklı.

Çoğu C programcısı en az bir miktar C ++ ve bunun tersi yapabilir.

Böyle bir kişiye C / C ++ programcısı demesi mantıklı değildir. Evet, muhtemelen birinde uzmanlaşırlar, ancak kelimenin tam anlamıyla diğer dillerden birini yapamayan yetkin bir C veya C ++ programcısı olan biri var mı? Bir şekilde, hepsi C / C ++ programcıları değil mi?

"C / C ++" derken yanlış bir şey yok. Önemli olan ne anlaşılıyor?

İngilizce, dilbilgileri ifade etmek için bir araç değildir . Sen edebilirsiniz mantık için İngilizce kullanmak, ama sadece ve büyük çabayla.

Bunun nedeni, kelimelerin doğal olarak kesin anlamlara sahip olmaları değil, belirsiz bir ifade ve çağrışım bulutundan ibaret olmasıdır. Önemli olan, insanlar söylediklerinizi anlarsa.


5
@ BЈовић Küçük bir terminolojinin kabul edilebilirliği konusunda sizinle aynı fikirde değiller, bu yüzden farkı anlayamadıkları ve yetersiz oldukları sonucuna varıyorsunuz. Bu söylenecek oldukça mantıksız bir şey.
Ben

4
@ el.pescado Evet. İnsanların aslında PHP / JavaScript ile ilgili olduğunu göreceksiniz. Neden olmasın? Mesele anlaşılmalı, kelimelerle oyun oynamak değil.
Ben

10
@ BЈовић Hiçbir anlam ifade etmiyorsun. "Tamamen farklı" değiller. C ++, C'den çok daha büyük bir dildir, ancak içindeki C'nin neredeyse tümünü içerir. C ++ 'ın uygun bir süperset olmasını engelleyen uyumsuzluklar var, ancak bunlar küçük, ilave ayrılmış kelimeler gibi, bir kaç tane daha gerek duyulur, ama bu oldukça fazla. Öyle neredeyse sadece olarak değil, uygun bir üst küme.
Ben,

7
@ BЈовић Belki de ne yazdığımı anlamadınız. Neden her durumda bir C programını adapte etmenin mümkün olduğunu görmek için buraya bakmıyorsunuz, böylece C ++ olarak da derleniyor. david.tribble.com/text/cdiffs.htm#C99-vs-CPP9
Ben

7
@ BЈовић Eğer terminoloji konusunda bilgili biriysen, C'nin " işlevsel " olmadığını , daha ziyade " prosedürel " olduğunu - başkalarına yetersizlik suçlamalarını saptırmadan önce anlamak isteyebileceğin bir fark olduğunun farkında olmalısın.
RM

15
  1. C / C ++ terimini kullanmayı bırakmalı mıyım?

Kesinlikle. Bu yapının neyi ifade etmesi gerektiği açık değil, belki de, C ve C ++ 'nın terimi kullanan kişi adına ne olduğu konusunda kafa karışıklığı dışında.

Bu karışıklık bu kadar yaygın bir hayal kırıklığı kaynağı olduğundan, birçok insan bu konuda oldukça duygusal bir hal aldı ve bu terimin tek başına ortaya çıkması, katkılarınız konusunda olumsuz olmaları için yeterli neden olacak. Bu aptalca görünebilir ama elimizdekiler gibi görünüyor.

“C / C ++” hakkında konuşmak yerine, aslında ne demek istediğinizi açıkça belirten bir terim kullanmanızı öneririm.

  • C ++ 'ta C ++ için de geçerli olabilecek ya da olmayabilecek bir şeyden bahsediyorsanız, sadece C deyin .

    Örnek: İşlev C dilinde nasıl mainbildirilmelidir?

    İlk başta, C ++ cevabının aynı olduğu görünebilir: int main()veya int main(int, char**). Ancak tartışma devam ettikçe, C ++ 'da, işlevin global kapsamda bildirilmesi gerektiğini, bunun C de bir anlam ifade etmeyeceğini, çünkü namespaces' ye sahip olmadığını belirtmek uygun olabilir . Öte yandan, C maintekrarlayan bir şekilde C ++ çağırırken izin verir . C ++ 'da return 0;“düşmek” durumunda bir örtüklük vardır, mainancak C'de returnherhangi bir yolda ifade gereklidir. Liste devam eder ve tartışılacak dilin ne olduğunu açıkça belirtirseniz, tartışmayı çok daha basit hale getirir.

  • C ++ 'da C için de olabilecek ya da olmayabilecek bir şeyden bahsediyorsanız, sadece C ++ deyin .

    Örnek: Bir Will malloc()ed dizisi ints başlangıçta C ++ her sıfır olabilir mi?

    C için kısa cevap aynı olur: hayır. Ancak cevap devam ettikçe, callocC ++ 'ın iyi bir alternatif std::vector<int>olabileceğini, ilk etapta daha iyi bir seçim olabileceğini belirtmek faydalı olabilir.

  • C ve C ++ arasındaki benzerliği işaret etmek istiyorsanız, C ve C ++ tuşlarına basın .

    Örnek: C ve C ++ 'da, sizeofbir intuygulama tanımlanmıştır ve derleyiciler ve mimariler arasında değişebilir.

    Burada, C ve C ++ 'nın aynı şekilde davrandığını belirtmek isteriz. Açıkça her iki dilden de bahsediyoruz .

Aslında daha spesifik olmanızı ve sadece “C” veya “C ++” hakkında değil, tam sürüm hakkında konuşmanızı da öneririm. Her iki dil de evrim geçiriyor ve böyle açık bir cümle

C ++ yalnızca C stili destekler, yorum /* … */ve // …yorumlar /* … */.

ne doğru ne de yanlış.

  1. # 1 cevabı evet ise, C ve C ++ karışımı kullanan bir programı nasıl çağırırım?

Dillerin çakışması nedeniyle, her bir C programı, C ++ 'ya benzeyebilecek veya bunun tersi görünebilecek parçalar içerecektir . Bununla birlikte, yazarlar muhtemelen bir C veya C ++ derleyicisi kullanmaya karar vermişlerdir. Yani “programı yazılmıştır söylemek C bir C derleyicisi ve” programı yazılır ile derlenmiş ise “ C ++ onlar herhangi bir modern C ++ özelliklerini kullanmayı reddetme olsalar bile, onlar C kullanırsanız ++ Derleyici”. Bazı insanlar C ++ kodunu C tarzı C ++ olarak adlandırır . Aşırı yüklenmenin olmaması, istisnalar, polimorfizm, şablonlar ve G / Ç bu kodun ortak bir özelliğini taşır.

Bunun yerine, bazı dosyalar C dilinde yazılır ve bir C derleyicisi ile derlenir ve diğer bazı dosyalar C ++ ile yazılırsa ve bir C ++ derleyicisi ile derlenir ve ardından birbirine bağlanan nesne dosyaları, “program bir C ve C ++ 'nın karışımı ”aslında aslında yaptınız.

Bununla birlikte, yazarlar her dosyayı bir C veya C ++ derleyicisi ile derlenebilecek şekilde yazmak için büyük özen göstermişlerse ve sonuçta ortaya çıkan program aynı şeyi yapacaktır, “programın ortak bir C ve C ++ alt kümesinde yazılmıştır ”.

İkincisi, genellikle C ve C ++ kodu arasında paylaşılması gereken başlık dosyaları için geçerlidir. Bu arada, böyle bir kod yazmak kolay değil. Eğer daha fazla ancak böyle yapılar C ve C ++ içinde geçerli olduğunu kullanıldığını vurgulamak istiyorsanız ve çok farklı derleyici satıcılar tarafından desteklenmektedir terimi bir taşınabilir C ve C ++ ortak alt küme kullanılabilir bu vurgulamak.

  1. Her ikisinin de “farklı” dilleri olduğu göz önüne alındığında, bir noktada C ++ derleyicilerinin C dilinde yazılmış kodları desteklemekten vazgeçmesi olasıdır (modern C ++, işaretçiler, dinamik bellek kullanımı vb. Gibi temel şeyler için C zihniyetinden uzaklaşmaktadır)?

Bu soruyu anladığımdan emin değilim. C ve C ++ yana olan farklı dil, bunlardan biri için bir derleyici diğeri için yazılmış bir programı kabul bekleyemezsiniz. Bununla birlikte, derleyiciler genellikle modüler bir şekilde tasarlanmıştır ve bir derleyicinin bir C ++ ön ucu varsa , olasılıklar iyidir, ayrıca bir C ön ucuna sahip olacaktır. (Daha sonra bunlardan hangisini komut satırı düğmesi veya benzer yöntemlerle istediğinizi seçersiniz.) Her iki dil de yaygın kullanımda olduğu sürece, bunun değişmesi pek mümkün görünmüyor. “Modern C ++” hakkındaki düşünceniz temel olarak iyi kodlama standartları ve standart kütüphane meselesidir. Gönderen derleyici'nın açısından, her iki dilde evrimi yerine uzaklaşan daha yakınsama olduğunu.

  1. Şu anda uyumluluğu korumak için C / C ++ standartlarını yapan kişiler arasında herhangi bir işbirliği var mı?

Evet. Bellek modeli ve C ++ 11 ve C11'de tanıtılan atomik işlemler kütüphanesi buna iyi bir örnektir. Her iki dilin tasarımcılarının da uyumluluğun önemli olduğunu ve onu geliştirmek için çalıştıklarını fark ettikleri görülüyor. Şahsen, işbirliğinin daha yoğun olmasını ve iki ISO çalışma grubunun belki de bir araya gelmesini diliyorum, ancak dileklerim önemli değil.

Bjarne Stroustrup, C ve C ++ sürümleri arasındaki farkları ve ortaklıkları , ironik bir şekilde “C / C ++ Uyumluluğu” başlıklı C ++ Programlama Dilinin 4. baskısının § 44.3'ünde konuşur . Terimin kullanımı, bu durumda ne anlama geldiği açıkça belli olduğundan, uygun olabilir.

  1. Eğer # 4 evet ise, böyle bir işbirliği yakın bir gelecekte modern C ++ 'ın ortaya çıkması ile sonuçlanabilir (11/14/17).

Yukarıda tartışıldığı gibi, C ++ 11'de gerçekleşti ve tekrar olması bekleniyor / umuyor / gerekiyordu.


Nasıl doğru ne yanlış olabilir?
JDługosz

4
“Yeşil şeylerin pahalı olduğu” ifadesinde olduğu gibi, iyi tanımlanmış bir gerçeğe sahip değildir. C ve C ++ sürümlerinin belirli bir kombinasyonu için doğrudur, diğerleri için yanlıştır.
5gon12eder

5

C / C ++, C ve C ++ ile kesişimdir.

int new;C / C ++ değil ve ikisi de değil vector<int> foo;.

Benzer şekilde, C89 / C99 ne bu iki dil, kesişme olduğu enum bool { false, true };veya for(int i = 0;;)izin verilir.

Ve C ++ 11 / C ++ 14 vb.

Birinin altında derleme, diğeri altında derlenme anlamına gelmese de, C ++ 11 ve C ++ 14 altında derleyen (ve doğru çalışan) kod yazmak mümkündür. Aslında, birçok insan bunu yapar.

Ve birçok insan C ve C ++ 'da çalışan kod yazar.

Açıkçası, örtüşme ne kadar büyük olursa, o kadar anlamlı olur; C / C ++ / Java kodu hakkında herhangi bir soru görmeyi beklemiyorum.


Bu dillerin ortak bir alt kümesinden bahsetmek "mantıklı" olsa da, birçok soru bu alt kümede cevap vermeyecektir, örneğin C ve C ++ 'da main () ne dönmeli?

Ancak, bu özelliklerin "sürüm" veya "dil adı" veya başka bir şekilde farklılaştırılmış olup olmadığına bakılmaksızın, çoklu dil özellikleri için çalışan kod hakkında konuşabilirsiniz.


3

Bu, diğer cevap ve yorumların bazılarında görülen "bu, metale yakın çalışan programcılar için bir koddur ve yönetim bağlamında tamamdır" pozisyonuna bir cevaptır.


Bu yorumun bile dikkatli yapılmasını savunuyorum.

En azından 90'ların ortasından başlayarak, bir C ++ programcısı ve kendilerini bir C programcısı olarak tanımlayan biri istemeniz durumunda, nesneye yönelik tasarım hakkında ne kadar bilgi sahibi olduklarını, bir nesnede hata ayıklama konusunda ne kadar deneyime sahip olduklarını sormanız gerekirdi. odaklı bağlam ve şablon kütüphanelerini kullanma yetenekleri hakkında. Görüşme ve işe alım sürecinde tam olarak bu sorunları araştırmak istersiniz.

Kapak tarafında, C ++ guruları "modern C ++" yu bastırmaya başladığından bu yana on yıldan fazla bir süre geçti. C ++ 11'in ortaya çıkmasıyla birlikte, artık çok paradigma programlama için açık bir destek var ve hiçbir çıplak işaret göstermeyen koda doğru itme çok güçlü. Bunun anlamı, bugün bir C pozisyonu için bir C ++ programcısıyla röportaj yaparsam, bu kişinin gerçek, ayak atışlarına uygun işaretçilerle ne kadar tanıdık olduğunu kontrol etmekten çok endişe edeceğim.

Bugünlerde iş dünyasında değilim (Stack Overflow'un bebeklik dönemindeyken bile), bu nedenle hayali görüşmecilerin ne sıklıkla geçiş becerilerine sahip olamayacağı konusunda bir tahmin yapmayacağım. Bence en sık uygulanan diller artık gerçekten çok farklı.

Kısacası "C / C ++" sadece teknik bağlamlarda değil, aynı zamanda birçok iş ortamında da bırakılmalıdır.


"C veya C ++, kim bilir", "C ve C ++, birbirine bağlı", "C ve C ++, kesişme" veya "C veya C ++" anlamına gelip gelmediğinin belirsizliğini belirtmenin iyi bir yolu bir şekilde onunla kaçabileceği yerlerde bile, giderek daha az haklı gösterilebilir.
Deduplicator

2

Bu sorunun en basit cevabı bu terimi hiç kullanmamış olmanız gerektiğidir . Olmaması gereken bir terimdir. Bir anlamı yok. Her program C veya C ++.

Ve bu, C ++ x0, C ++ 11 (ya da genel olarak modern C ++ 11/14/17) ortaya çıkana kadar sessizdi.

C ++ 98 ve 03 sınıfları ile uzaktan bile C değil. Bunu sana kim öğretti, hiçbir şey bilmiyor ve onları unutabilirsin. Bu asla doğru olmadı.


Bu tamamen doğru değil. Bir keresinde, "C / C ++" adlı bir dil için önerilen bir dili tanımlayan bir sayfa vardı, diğer şeylerin yanı sıra, bir tür sistemin (yakın) yokluğunu belirledi. Ne yazık ki, sayfa o zamandan beri kaldırıldı ve onu barındıran site o zamandan beri arşivdeki kopyasını archive.org'dan silen bir robots.txt dosyası hazırladı.
greyfade

1
Aha, archive.is'de bir kopyasını buldum: Gerekçe , Sözdizimi ve Anlambilim .
greyfade

5
"Her program C veya C ++." Katılmıyorum. Bir C programını almak ve bir kerede C ++ 'a bir dosyaya taşımak oldukça yaygındır (bu dosya için bir derleyici seçeneğini değiştirerek). Bazı dosyalar hiçbir zaman taşınamayabilir ve sonsuza dek C kalabilir. Böyle bir program hem C hem de C ++ dilinde yazılmıştır
nikie

Pek sayılmaz. Bu program, her biri C veya C ++ olan alt programlardan oluşur. Derleyici ile ilgili olarak tüm program olan her bir TU, C veya C ++ olarak derlenir.
DeadMG 16

3
"Her program C veya C ++" değil. Prof. Bjarne Stroustrup: “İyi yazılmış C, aynı zamanda yasal C ++ olma eğiliminde. Örneğin, Kernighan & Ritchie'deki her örnek: "C Programlama Dili (2. Baskı)" aynı zamanda bir C ++ programıdır. ' stroustrup.com/bs_faq.html#C-is-subset
Ben

1

Kavramsal olarak, C kaynak dosyalarının tasarlanmasında özel bir zorluk olmamalıdır, böylece C ++ ile olduğu gibi derlenebilirler. Bunu yapmanın gerçekten önemli avantajları olabilir. Örneğin, gömülü bir sistem için kod yazarken kodu barındırılan bir PC ortamında test edebilmek bazen yararlı olabilir. Kod C ++ gibi temiz bir şekilde derlenirse, "MOTOR_ENABLE = 1;" gibi bir deyim olabilir. Gömülü sistemdeki geçici bir G / Ç bitine (C olarak derlenir) yazın, ancak PC'deki emülasyon mantığını tetikleyin (C ++ olarak derlenir). Bilgisayarda, bir uint16_t'nin daha küçük gömülü sistemler üzerinde davranması gibi davranacak bir C ++ tipi tasarlanması da muhtemelen mümkün olacaktır (örn u16 x=65533;.x*xDokuz olarak, istediği herhangi bir şeyi yapmak için serbest hüküm sürmek yerine), ancak henüz öykünücülerimin hiçbiri [kısmen kullandığım C ++ derleyicileri bu gibi durumlarda tuhaf bir şey yapmadı].

Ne yazık ki, C programcıları ve C ++ programcıları, dillerin yıllar içinde uyumlu şekillerde geliştiği birbirlerine karşı yeterli antipatiye sahipler. C89, C ++ 'ın (faydalı prototipler gibi) bazı faydalı özelliklerinden bazılarını adapte etmeye çalışırken, C ++' ın özelliklerinden herhangi birini isteyen programcıların C ++ 'ı kullanmaları gerektiği, bunun birçok durumda olacağı gerçeğini göz ardı ederek bir tutum ortaya çıktığı görülmektedir. C ++ 'nın bazı özelliklerini (örneğin, gerekmeyen diğer özelliklerle ilgili maliyetleri kabul etmek zorunda kalmadan statik veya statik satır içi bağlantıya sahip işlevleri aşırı yükleme yeteneği (örneğin, dışa aktarma ile ilgili isim yönetimi) kullanabilmek için yardımcı olabilirsiniz. aşırı yüklenmiş işlevler).

C89 ve C ++ 98'in kesişimi çalışılabilir bir dil olsa da, daha sonraki C sürümlerinin C ++ sürümleriyle kullanılabilir olması büyük olasılıkla büyümekten ziyade küçülmüştü (Strict Aliasing Rule gibi şeyler sayesinde) ve trendler her zaman lehinedir. artan çatlak.


1
"C ++ 95" nedir? Teknik bir rapor mu?
Ben Voigt

1
Dahili işlevleriniz için aşırı yükleme yapmak istiyorsanız ancak harici işlevleriniz için bir isim yönetimi yoksa, birincisini anonim hale getirebilir namespaceve ikincisini olarak ilan edebilirsiniz extern "C", sonra bir C ++ derleyicisi kullanın.
5gon12eder

@BenVoigt: Mea culpa. Bakmalıydım. C99'dan önceki C ++ sürümü. C89 çıktığında, C'yi C ++ gibi daha fazla yapmaya çalıştı, ancak C99 C ++ 'ın kesinlikle ilgilenmediği bir dizi özellik ekledi (örneğin değişken uzunluklu diziler). Çok fazla C ++ programlamıyorum, ancak birkaç C ++ özelliğinin, C'nin farklı özelliklerin yardım ettiğinden daha fazla yardımcı olacağını düşünüyorum.
Supercat

@ 5gon12eder: C ++ kodunu asla bir C projesine bağlamayı denemedim. Gerçekten her şeyin statik / satır içi olması ya extern "C"da başka komplikasyonlar olması kadar basit midir (örneğin statik nesne başlatma, vb.)? C ++ 'da bunu yapmak için herhangi bir yol var mı? Böylece foo(1234)bir foo_const(1234)makro çağırırken foo(x)[ xsabit değil] bir foo_var(x)fonksiyon çağırır mı? Gömülü kodda, SET_PORT(port, state)liman ve durumun her ikisinin de olup olmadığına dayanan üç formun olması gibi bir "işlev" için mantıklı gelebilecek birçok durum vardır ...
supercat

... derleme zamanı sabitleri, bağlantı noktası sabittir ancak durum değildir ya da bağlantı noktasının ya da durumun sabit olmadığı yerlerdir. Temiz bir şekilde şablon veya başka bir standart C ++ mekanizması kullanarak bunu başarmanın bir yolu var mı, yoksa sadece gcc uzantılı derleyicilerde mümkün mü?
supercat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.