2016-09-13 3 views
-1

Ich bin mit gcc (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3) 4.8.4 und Compilierung folgenden Code:gcc Autokorrektur-Format in printf

void main() 
{ 
float f= 10.0; 
char *str = "hello"; 
printf("f=%.1f str=%s\n",str, f); 
} 

Compiler Warnung zeigt, dass erwartet wird:

prac.c: In function 'main': 
prac.c:8:1: warning: format '%f' expects argument of type 'double', but argument 2 has type 'char *' [-Wformat=] 
printf("f=%.1f str=%s\n",str, f); 
^ 
prac.c:8:1: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'double' [-Wformat=] 

Während der Ausführung dieses Programms wird die Ausgabe jedoch automatisch korrigiert.

# ./a.out 
f=10.0 str=hello 

Wie das passiert. Welches Feature des Compilers macht dies. Jede Möglichkeit, diese Autokorrektur zu deaktivieren.

+8

Undefiniertes Verhalten == Undefiniertes Verhalten. (Es hat nichts mit dem Compiler zu tun, und es gibt keine "Autokorrektur" - es ist nur ein Zufall des ABI.) –

+4

@PaulR: Rollcredits. –

Antwort

4

Das ist nicht "automatische Korrektur", es ist "undefined Verhalten." Es passiert, weil Fließkommavariablen an Funktionen in einem separaten Raum oder an ganzzahligen Typen übergeben werden können (oder nicht!). Wenn Sie also einen Zeiger (oder einen Zeiger) und einen Doppelpunkt übergeben, verwenden sie immer noch den ersten Steckplatz für jeden Typ, obwohl Sie sie in der falschen Reihenfolge angegeben haben.

Kompilieren Sie mit -Wformat=2 und -Werror und Sie werden dieses Problem nie wieder sehen, weil GCC (und Clang) wird sich weigern, solchen Code zu bauen.

+0

Ich nehme an mit "int" meinst du den char pointer? – Lundin

+0

"* oder möglicherweise nicht! *" - In der Tat würde derselbe Code nicht funktionieren, wenn er für 32-Bit x86 kompiliert wird. – Dolda2000

+0

@Lundin: danke, behoben. –