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()
Személyes eszközök