C részhalmaz (C++)
A Wikipédiából, a szabad enciklopédiából.
A C++ a kompatibilitás miatt jelentős részt megőrzött a C nyelvből: szintaxisát, kulcsszavakkal együtt, és a standard könyvtárát.
Tartalomjegyzék |
[szerkesztés] Inkompatibilitás
Bár a C-t gyakran nevezik a C++ részhalmazának, ez csak részben igaz, meglehet a nyelv alkotója törekedett a maximális kompatibilitásra. A legtöbb C kód érvényes C++ kód is, de sokszor kell kisebb dolgokat átírni, mert nem fordulnának le, vagy más szemantikával bírnak.
[szerkesztés] Szintaktikus hibák
A problémák egy része a C++ erősebb típusellenőrzéséből fakad, ilyen például, hogy a void* nem konvertálódik automatikusan bármilyen T* mutatóvá.
Ez a mallocot tartalmazó kódok nagy részét invalidálja, mivel az void*-t ad vissza.
int* i = malloc(sizeof(int)*10); //érvényes C-kód, érvénytelen C++: implicit konverzió void*-ról int*-ra
Ehelyett konverziós operátort kell használni:
int* i = (int*)malloc(sizeof(int)*10); //így lefordul mindkét fordítóval
Egy másik gyakori gond a C++ kibővített kulcsszókészlete, amelyet sok C programban azonosítóként használnak.
További eltérések még, amelyek fordítási hibát okozhatnak C-kód C++ fordítóval való fordítása során:
- Mindkét nyelv engedélyezi beágyazott struktúrák létrehozását, de a hatókört másként értelmezik (a C++ a belső struktúrát a külső hatókörén/névterén belül értelmezi).
- A "non-prototype" stílusú függvénydeklarációt (azaz nincs megadva paraméterlista, ez a C -ben meghatározatlan számú paramétert jelent) a C++ nem támogatja (és 1990 óta a C sem). Hasonlóan az implicit függvénydeklarációt (függvény használata annak deklarálása előtt) is elutasítja a C++ (1999 -ben a C -ből is kivették).
- A C megengedi struktúrák, úniók és felsorolt típusok deklarálását a függvények prototípusában míg a C++ nem.
- A C++ új, egysoros kommentet vezetett be: // alakban. Bár az 1999-s C szabvány is bevezette ezt a kommentformát, az osztás utáni közvetlen C-stílusú komment (//*) átalakul egysoros kommenté. Ez igen ritka hiba, és egy szóköz beszúrásával megoldható.
[szerkesztés] Szemantikai eltérések
Ezek az eltérések nem okoznak fordítási hibát(többnyire), de a program máshogy fog működni, attól függően, hogy C vagy C++ kódként fordítjuk.
- Más a ternáris operátor precedenciája, javítani a kifejezések bezárójelezésével lehet.
[szerkesztés] Egyéb eltérések
Ezek az eltérések a C++-ban szereplő, de C kód fordításakor nem zavaró eltérések közül néhány.
- A vessző operátor (,) eredményezhet balértéket C++-ban(míg C-ben nem)
- C++-ban engedélyezettek a redundáns typedefek, míg C-ben nem lehet több egy scopeban
- A C-ben a felsorolt típus mindig int, míg C++-ban a mérete az elemeinek értékétől függ(a legkisebb, amelybe beleférnek)
- A C++ megváltoztat néhány a C standard könyvtárában lévő függvényt azzal, hogy konstanssá tesz visszatérési értékeket és paramétereket (pl.: az strchr a C -ben char* típusú értékkel tér vissza míg ez a C++ -ban const char* -á változik).
[szerkesztés] Standard könyvtár
A C++ kisebb módosításokkal(lásd feljebb) átvette a C standard könyvtárát, eredeti néven elérhetők az eredeti könyvtárak a globális névtérben, valamint .h kiterjesztés nélkül és egy 'c' bevezető névvel a fejállományok az std névtérbe helyezve szerepelnek.
#include <stdio.h> //printf() #include <cstdio> //std::printf()


)