- Lista parametrilor unei functii
In pre-standard C lista parametrilor unei functii se putea preciza astfel:
int negate(n)
int n;
{
return -n;
}
Acest stil vechi este inca legal in ISO C; in C++ este ilegal!
- Declararea unei functii
In C este doar recomandat, nu si obligatoriu, ca o functie, pentru a fi apelata, sa i se precizeze anterior
declaratia (prototipul). In C++ o functie nu poate fi apelata fara o declaratie anterioara. Din acest motiv
urmatoarea secventa de cod este valida in C si invalida in C++:
int main(){
int n;
n=negate(5);
return 0;
}
- Lista vida de parametri
O functie declarata cu o lista vida de parametri poate avea, in C, orice numar de argumente, de orice tip.
In C++ o astfel de functie nu accepta argumente.
int f();
void g(int i){
f(i); /* valid in C, dar nu si in C++ */
}
- Tipul implicit pentru declaratiile lipsa
/* valid in C, dar nu si in C++ */
void func(){
const k=0; /* in C, implicit int; invalid in C++*/
}
ISO C este in proces de revizie astfel incat declaratiile implicite int sa nu mai fie permise.
- Declaratii repetate ale variabilelor globale
In C o variabila globala poate fi declarata de mai multe ori, fara a utiliza specificatorul extern.
In C++ o variabila globala poate fi definita o singura data;
definitii repetate in unitati de traducere distincte conduc la erori de link-editare.
/* valid in C, dar nu si in C++ */
int flag;
int num;
int flag; /* definitie repetata */
- Conversia implicita a pointerilor de tip void*
In C, un pointer void* este implicit convertit spre orice alt tip in atribuiri si initializari. De exemplu:
long *pl=malloc(sizeof(long)); /* conversie implicita din void* in long* */
In general, aceste conversii implicite sunt nedorite deoarece pot conduce la bug-uri:
long *pl=malloc(sizeof(short)); /* oops! */
In C++ pointerii de tip void* trebuie convertiti in mod explicit la tipul dorit!
- Reprezentarea interna a pointerilor NULL
NULL este un pointer constant cu o definitie dependenta de implementare; in C el este definit in mod uzual prin:
#define NULL ((void*)0)
In C++, deoarece pointerii sunt tare tipizati, daca aceasta conventie ar fi pastrata, atunci o instructiune
char* p=NULL;
ar fi expandata in
char* p=(void*)0;
ceea ce ar genera eroare la compilare!
Din acest motiv NULL este definit in unele implementari C++
ca fiind const int NULL=0
iar in altele #define NULL 0.
- Linkage implicit pentru constantele globale
In C o constanta globala are linkage extern; in plus, ea este initializata implicit cu 0.
In C++ o constanta globala (nedeclarata explicit cu extern) are linkage intern si trebuie initializata!
- Tablouri de caractere terminate cu caracterul NUL
In C un tablou de caractere poate fi initializat cu un literal a.i. el sa nu contina si caracterul terminator.
In C++ tabloul trebuie sa fie suficient de mare pentru a contine si caracterul '\0'(NUL)!
const char message[5]="hello"; /* message nu contine '/0'; valid in C, dar nu si in C++ */
- Atribuirea de intregi tipurilor enum
Deoarece C++ este tare tipizat, nu mai este permisa atribuirea de intregi variabilelor de tip enum
fara a utiliza o conversie explicita!
- Definirea structurilor in lista parametrilor unei functii sau in tipul returnat
Nu mai este legala in C++.
- Dimensiunea unei constante caracter
In C sizeof('a')==sizeof(int). In C++ sizeof('a')==sizeof(char).
- Valoarea returnata de main()
In C, terminarea functiei main() fara a executa o instructiune return determina returnarea unei valori
nedefinite catre mediu. In C++, main() executa implicit un return 0 intr-un astfel de caz!