C részhalmaz (C++)
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.
Inkompatibilitás
[szerkeszté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.
Lexikális eltérések
[szerkesztés]- 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ó.
Szintaktikus hibák
[szerkesztés]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, s bár ez lexikális eltérés, mégis a parser ismeri fel.
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:
- 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, uniók és felsorolt típusok deklarálását a függvények prototípusában míg a C++ nem.
- A vessző operátor (,) eredményezhet balértéket C++-ban, míg C-ben ez nem lehetséges
- A C megengedi a paraméterek típusának megadását a felsorolásuk után, a C++-ban ez hiba:
void f(a,x) char* x {} //ehelyett void f(int a, char* x){}
- A C-ben az int alapértelmezett típus, az ISO C és a C++ megtiltja az "implicit int" használatát. Lásd eggyel feljebb.
Szemantikai eltérések
[szerkesztés]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 - három paraméterű - operátor) precedenciája, javítani a kifejezések bezárójelezésével lehet.
- 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 és a karakter konstansok mérete mindig int, míg C++-ban az elemeinek értékétől függ (a legkisebb, amelybe beleférnek), illetve sizeof(char)
- 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 C megengedi egy függvény meghívását annak deklarálása előtt, ez C++-ban hiba.
- A C-ben ki lehet kerülni a kezdeti értékadásokat (pl gotoval), C++-ban ez is hiba.
Egyéb eltérések
[szerkesztés]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 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).
- Globális konstansokat a C automatikusan külső szerkesztésűként kezeli, míg C++-ban kötelező az extern kulcsszó használata vagy kezdőérték adása.
Standard könyvtár
[szerkesztés]A C++ kisebb módosításokkal (lásd feljebb) átvette a C standard könyvtárát. Ha a globális névtérben szeretnénk elérni a C-s függvényeket, akkor használjuk az eredeti "C stílusú" include fájlokat. A C++ stílusú include-olása a C-s könyvtáraknak úgy történik, hogy elhagyjuk a ".h" kiterjesztést a fájl nevéből és elérakunk egy "c"-t. Így lesz pl. az "<stdio.h>"-ból "<cstdio>". Fordítótól függően lehetséges, hogy a függvényeket megtaláljuk a másik névtérben is.[1]
#include <stdio.h> // printf() biztosan jó, az std::printf() nem biztos
#include <cstdio> // std::printf() biztosan jó, a printf() nem biztos
Források
[szerkesztés]- ↑ GNU C++ dokumentáció. Bekezdés: The C Headers and namespace std. [2010. január 28-i dátummal az eredetiből archiválva]. (Hozzáférés: 2010. január 18.)