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

  1. 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.)