Yanıtlar:
Eğer karşılaştırırsanız C89
ile C++
daha sonra burada birkaç şey vardır
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 pek çok başka durum ekler
// 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;
C'de yasal bir TU, ancak C ++' da değil.
auto a;
En yeni C ++ standart revizyonunda geçerli olduğuna dikkat edin .
a
?
auto x;
en yeni revizyonda geçerli değildir, ancak örneğin geçerlidir auto x = 0;
. İlk başta biraz şok oldum :)
C ++ da yeni anahtar kelimelere sahiptir. Aşağıdaki geçerli C kodudur, ancak C ++ altında derlenmez:
int class = 1;
int private = 2;
int public = 3;
int virtual = 4;
Bir çok şey var. Sadece basit bir örnek (C'nin uygun bir C ++ alt kümesi olmadığını kanıtlamak yeterli olacaktır):
int* test = malloc(100 * sizeof(int));
C'de derlenmeli ancak C ++ 'da değil.
int*
,.
void *
, C'de herhangi bir işaretçi tipine atanabilen ve C ++ başka herhangi bir işaretçi tipine atanamaz.
Gümrüğe eğer C ++ ile bir struct
, union
ya da enum
, adı herhangi elemeleri derhal erişilebilir:
struct foo { ... };
foo x; // declare variable
C'de bu işe yaramaz, çünkü bu şekilde bildirilen türler kendi farklı ad alanlarında yaşarlar. Bu nedenle, yazmanız gerekir:
struct foo { ... };
struct foo x; // declare variable
struct
İkinci satırdaki varlığına dikkat edin . Aynısını union
ve için enum
(ilgili anahtar kelimeleri kullanarak) yapmanız veya typedef
hileyi kullanmanız gerekir :
typedef struct { ... } foo;
foo x; // declare variable
Sonuç olarak, belirsizliği ortadan kaldırabileceğiniz için, C'de aynı adı verilen birkaç farklı türden olabilir:
struct foo { ... };
typedef enum { ... } foo;
struct foo x;
foo y;
Bununla birlikte, C ++ 'da, bir struct
adın struct
önüne anahtar kelime ekleyebildiğinizde , ad alanları birleştirilir ve bu nedenle yukarıdaki C pasajı geçerli değildir. Öte yandan, C ++, C'den typedef
değişmeden hile kullanımına izin vermek için bir türün ve bu tür için bir typedef'in aynı ada (açıkçası etkisiz) sahip olmasına izin vermek için özel olarak bir istisna yapar .
struct
, union
ve enum
) aynı ad paylaşır. Daha iyi bir örnek, struct foo { ... }; typedef enum { ... } foo;
Bu aynı zamanda ne tür C kullandığınıza da bağlıdır. Stroustrup, C ++ 'ı elinden geldiğince uyumlu hale getirdi ve artık 1989 ANSI ve 1990 ISO standartlarıyla uyumlu hale getirdi ve 1995 sürümü hiçbir şeyi değiştirmedi. C komitesi, 1999 standardıyla biraz farklı bir yöne gitti ve C ++ komitesi, bazı değişikliklere uymak için bir sonraki C ++ standardını (muhtemelen önümüzdeki yıl ya da öylesine) değiştirdi.
Stroustrup, C90 / C95 ile uyumsuzlukları "The C ++ Programming Language", Special Edition (bazı ek malzemelerle 3. basım) Ek B.2'de listeler:
'a'
bir int
C, bir char
C ++ ' dır .
Bir numaralamanın boyutu int
C'dir, C ++ 'da olması gerekmez.
C ++ //
satırın sonuna kadar yorumlar içerir, C ise yoktur (yaygın bir uzantı olmasına rağmen).
C ++ 'da, bir struct foo {
tanım foo
global ad alanına yerleştirilirken, C' de buna struct foo
. Bu, bir struct
tanımın dış kapsamdaki bir adı gölgelemesine izin verir ve başka birkaç sonucu vardır. Ayrıca C, struct
tanımlar için daha geniş kapsam sağlar ve dönüş türü ve bağımsız değişken türü bildirimlerinde bunlara izin verir.
C ++ genel olarak türler konusunda daha zahmetlidir. Bir tamsayının bir tamsayının atanmasına izin vermez enum
ve void *
nesneler diğer işaretçi türlerine atanmadan atanamaz. C'de, aşırı büyük bir başlatıcı sağlamak mümkündür (char name[5] = "David"
burada C, sondaki boş karakteri atacaktır).
C89 int
birçok bağlamda örtük olarak izin verirken C ++ izin vermez. Bu, tüm işlevlerin C ++ 'da bildirilmesi gerektiği anlamına gelirken, C89'da int
işlev bildiriminde geçerli olan her şeyi varsaymak çoğu zaman mümkün olmuştur .
C'de, etiketli bir ifade kullanarak bir bloğun dışından içeriye atlamak mümkündür. C ++ 'da, bir başlatmayı atlarsa buna izin verilmez.
C dış bağlantıda daha liberaldir. C'de, küresel bir const
değişken örtük extern
olarak bulunur ve bu C ++ 'da doğru değildir. C, global bir veri nesnesinin birextern
, ancak bu C ++ 'da doğru değildir.
Çoğu C ++ anahtar sözcüğü, C'de anahtar sözcük değildir veya #define
standart C başlıklarında d'dir.
Ayrıca C'nin artık iyi bir stil olarak görülmeyen bazı eski özellikleri de var. C'de, bağımsız değişkenler listesinden sonra bağımsız değişken tanımlarına sahip bir işlev bildirebilirsiniz. C'de, benzeri bir bildirim, herhangi bir sayıda argüman alabilen int foo()
anlamına foo()
gelirken, C ++ 'da buna eşdeğerdir int foo(void)
.
Bu Stroustrup'tan gelen her şeyi kapsıyor gibi görünüyor.
Gcc kullanıyorsanız, uyarıyı kullanabilirsiniz -Wc++-compat
C ++ 'da bir şekilde şüpheli olan C kodu hakkında uyarılar vermek için . Şu anda gcc'nin kendisinde kullanılıyor ve son zamanlarda çok daha iyi hale geldi (elinizden gelenin en iyisini elde etmek için gecelik bir sürümü deneyebilirsiniz).
(Bu soruya kesin olarak cevap vermez, ancak halk hoşuna gidebilir).
Bence en büyük tek fark, bunun geçerli bir C kaynak dosyası olmasıdır:
int main()
{
foo();
}
Beyan etmediğimi unutmayın foo
yerde .
Dil farklılıklarının yanı sıra, C ++, C'den miras aldığı kitaplıkta bazı değişiklikler de yapar, örneğin bazı işlevler const char *
yerine geri döner char *
.
s,C,C89,
ve bunun geçersiz bir C99 kaynak dosyası olduğuna dikkat etmelisiniz .
#include <stdio.h>
int new (int n) {
return n/2;
}
int main(void) {
printf("%d\n", new(10));
return 0;
}
Ayrıca C ++ SSS girişine bakın .
Buradaki yanıtların bir kısmı, C ++ derleyicilerinin C89 (veya C99) kaynak kodunda başarısız olmasına neden olacak sözdizimi farklılıklarını kapsar. Bununla birlikte, her iki dilde de yasal olan ancak farklı davranışlar üretecek bazı ince dil farklılıkları vardır. sizeof (char)
Naveen bahsettiği fark bir örnektir, ama bir bir (ANSI) C programı olarak derlenmiş eğer "C" yazdırır programı ve "C ++" C ++ programı olarak derlenmiş eğer yaz listeleri bazıları.
C derleyicileri genellikle C ++ 'nın izin vermediği küçük bir köşe kesmeye izin verir. C ++, C'den çok daha katıdır. Ve genel olarak, bu farklılıklardan bazıları derleyiciye bağlıdır. g ++, örneğin Intel C ++ derleyicisinin izin vermediği bazı şeylere izin verir. Oldukça iyi yazılmış C kodu bile modern bir C ++ derleyicisiyle derlenmez.
Dilleri yalnızca sözdizimine göre karşılaştıramazsınız. Bunu yaparsanız, belki C'yi C ++ 'nın bir alt kümesi olarak görebilirsiniz. Bana göre C ++ 'nın OO olduğu (ve C'nin olmadığı) gerçeği C ve C ++' nın farklı diller olduğunu söylemek için yeterli.