C részhalmaz (C )

del.icio.us del.icio.us
Digg Digg
Furl Furl
Reddit Reddit
Rojo Rojo
Add to OnlyWire

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

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.

Lexikális eltérések

  • 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

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 ismersi 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 nem)
  • 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

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.
  • 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

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

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()

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.


Giant Panda

Mercedes Car
James Bond Guide
This site monitored by SitePinger.net