2010-09-08 14 views
7

Mögliche Duplizieren:
Why are C character literals ints instead of chars?C und C++ Unterschied in sizeof ('x')

Warum bei der Verwendung von C tut sizeof('x') Rückkehr 4 aber sizeof('x') in C++ 1 zurückgibt?

C++ ist normalerweise bestrebt, nicht mehr als eine Obermenge von C zu sein. Warum unterscheiden sich die beiden Ergebnisse?

Bearbeiten Nur noch eine weitere Klarstellung. Dies scheint eine bewusste Entscheidung seitens des Normenausschusses zu sein, und ich nehme an, dass die Änderung der Größe von "x" nicht ohne einen guten Grund erfolgt wäre. Ich bin daran interessiert, was der Grund ist.

+2

Mehr oder weniger ein (Anhang C der Unvereinbarkeiten zwischen C und C++ beschreibt) Duplikat von [Unterschiedliche Größe der Ergebnisse] (http://stackoverflow.com/questions/49046/different-sizeof-results), [Warum sind C-Zeichen-Literale anstelle von Zeichen ints?] (http://stackoverflow.com/questions/ 433895 /) und [Größe von (char) in 32-Bit-C-Compilern verstehen] (http://stackoverflow.com/questions/3451266/) und vielleicht ein oder zwei ot ihres. Gefunden mit http://stackoverflow.com/search?q=[c]+[c%2B%2B]+sizeof+character+literal. – dmckee

+0

keine der Duplikate erklären warum. – doron

+0

@deus: Es ist nur eine Designentscheidung. Der "c" -Weg bedeutet, dass der Compiler weniger Entscheidungen über die Typ-Promotion treffen muss (weil "Promotion" jedes Mal stattfindet), die vielleicht eine Rolle gespielt haben: Die Maschinen der frühen Siebziger waren langsam und hatten nur wenig Speicher, also einfache Compiler ein Muss. – dmckee

Antwort

16

die C++ zu zitieren Norm ISO 14882: 2003, Anhang C.1.1 2.13.2 Klausel

ändern: Art des Zeichenliteral von int geändert wird

Rationale char: Dies ist für den überladenen Funktionsargumenttyp-Abgleich erforderlich. Zum Beispiel:

int function(int i); 
int function(char c); 
function(’x’); 

Es ist bevorzugt, dass dieser Aufruf Spiel die zweite Version der Funktion eher als die erste

+0

Mehr oder weniger was ich dachte, aber schön in schwarz und weiß zu sehen. – doron

+0

Natürlich konnten sie * nur eine "char" literale Syntax eingeführt haben - zB 'C'x' ist vom Typ" char ", genauso wie" L'x "vom Typ" wchar_t "ist '. – caf

+0

Hinweis, ein Mehrzeichen-Literal zB ''abcd'' * * ist * noch vom Typ' int ', mit implementierungsdefiniertem Wert. – Potatoswatter

5

Weil C ist, ist 'x' eigentlich ein int, während es in C++ ein char ist.

C++ versucht, ist die starke Typisierung straffen, die ein wenig lax in C. war

+0

Faszinierendes Verhalten ... Ich bin kein C-Typ, aber das überrascht mich. Wenn Sie also 'printf ("% c "," x ");' aufrufen, werden für die varargs 4 Bytes auf den Stack geschoben, in C++ dagegen nur 1 Byte. Wie könnte das funktionieren, wenn man bedenkt, dass das CRT nicht weiß, in welcher Sprache es heißt? – tenfour

+0

+1, es ist in der Spezifikation! –

+4

@tenfour, nein - 4 Bytes werden auch in C++ gepusht. varargs Aufrufe haben viele Arten von Promotion-Regeln. –

7

C++ ist kein Obermenge von C. Besonders, wenn Sie die „aktuellen“ Versionen verwenden - ein Compiler in C++ 0x-Modus wird Choke auf C99-Code.

+0

Das liegt aber daran, dass der (damals) neue C99-Standard nicht enthalten war C++ – doron

+0

@ deus-ex C99 war jahrelang aus, bevor C++ 0x gestartet wurde. Wenn sie C zu einer Untermenge machen wollten, hätten sie die Änderungen einbezogen. In der Tat haben sie einige von ihnen enthalten. '#include ' bezieht sich auf C99 'stdint.h'. – kwatford

+0

C und C++ weichen leicht von den neuesten Versionen ab. Ich würde nicht erwarten, dass C99 in C++ 0x oder umgekehrt gerollt wird, in Bezug auf die gemeinsamen Feature-Sets. –

Verwandte Themen