/ / program wird nicht mit der neueren Version von g ++ - c ++ kompiliert

Programm kann nicht mit der neueren Version von g ++ - c ++ kompiliert werden

Ich habe den folgenden Quellcode. Was gut in Visual Studios und g ++ 3.4.6 kompiliert; aber nicht mit g ++ 4.4.3 (auf einer neueren Ubuntu-Maschine). Der neuere Compiler erfordert, dass ich die Verwendung von Atoi explizit einbeziehen. Ich versuche nur herauszufinden, was sich an diesem Verhalten geändert haben könnte. Ist es eine sstream-Header-Datei, die zuvor cstdlib enthielt, und dies nicht mehr tut? Oder hat sich das Verhalten des Compilers geändert?

#include <sstream>

int main()
{
char str1[]="123";
int i = atoi(str1);

printf ("value = %d",i);
return 0;
}

Antworten:

10 für die Antwort № 1

Sie müssen auch einschließen <cstdio> zum printf().

Technisch gesehen, wenn Sie die Kopfzeilen des Formulars angeben <cname> Anstatt von <name.h>Außerdem müssen Sie die Namen aus der Standardbibliothek mit qualifizieren std::. Viele Standard-Bibliotheksimplementierungen sind jedoch in dieser Hinsicht locker und setzen die Namen auch in den globalen Namensraum.

Es hängt von der Implementierung ab, welche Header verwendet werdenvon welchen anderen Kopfzeilen eingeschlossen werden. Sie sollten daher unbedingt alle Kopfzeilen einbeziehen, die Sie benötigen, und nicht davon ausgehen, dass sie automatisch eingefügt werden.


6 für die Antwort № 2

Ich verwende GCC 4.4.5 unter Debian, und die Header haben sich geändert, so dass Sie die erforderlichen Header nicht einfügen müssen. Sie müssen dies tun #include <cstdlib> und #include <cstdio> bekommen atoi und printf, da der Compiler beklagte, dass beide fehlen.

#include <sstream>
#include <cstdio>
#include <cstdlib>


int main()
{
char str1[]="123";
int i = std::atoi(str1);

std::printf ("value = %d",i);
return 0;
}

2 für die Antwort № 3

Nun ja. Das ist üblich. Sie sollten immer ALLE Header verwenden, die Sie direkt verwenden, und nicht davon abhängig sein, dass diese Header bereits enthalten sind.


1 für die Antwort № 4

Das Verhalten des Compilers hätte sich geändert <sstream> benutzt nicht atoi.

Sie hätten es wohl immer tun sollen #include <cstdlib>und Sie hatten Glück mit Ihren früheren Compilern.

Wie James McNeillis betont, sollten Sie dies auch tun #include <cstdio> um das zu benutzen printf Funktion.