2012-06-21 5 views
8

Ich habe ein Basisprogramm, die zwei Strings vergleichen:Warum ist strcmp unbekannt zu klingeln?

#include <string> 
#include <iostream> 

using namespace std; 

int main (int argc, char *argv[]) { 
    if(strcmp (argv[0],"./test") != 0) { 
    cout << "not equal" << endl; 
    } else { 
    cout << "equal" << endl; 
    } 
    return 0; 
} 

es mit gcc, aber nicht mit Klirren kompiliert:

> clang -o test test_clang.cpp 
test_clang.cpp:7:6: error: use of undeclared identifier 'strcmp' 
    if(strcmp (argv[0],"./test") != 0) { 
    ^
1 error generated. 

Warum es nicht mit Klirren kompilieren?

EDIT: Leute werden hart auf Stapelüberlauf, bis zu dem Punkt, dass ich zögere, eine Frage zu stellen. Die obige Frage hat eine einfache Antwort, gut, aber ist es normal, Fragen zu verwerfen (zweimal in der ersten Minute!), Weil sie eine einfache, aber nicht offensichtliche Antwort haben?

+0

Ich habe keine Ahnung, warum Leute dies abgelehnt haben. Es ist deutlich gesagt und eine gültige Frage. – aschepler

+0

"Diese Frage zeigt keinen Forschungsaufwand". Der erste Treffer in Google für "strcmp" hat ein Codebeispiel mit '#include ' (was auch eine gültige Lösung ist). Minimal Forschung hätte diese Frage beantwortet. Deshalb habe ich es abgelehnt. Triviale Fragen mindern den Wert dieser Seite. –

+2

Ein minimales Beispiel zu machen und die Ergebnisse zweier Compiler zu vergleichen, ist der Forschungsaufwand. – aschepler

Antwort

10

Verwenden

#include <string.h> 

oder

#include <cstring> 

statt

#include <string> 

Der String Header ist für die std :: string von C++. string.h ist für C * Zeichenketten mit null Endungen. cstring ist wie string.h aber für C++.

Der Grund, warum es mit gcc gearbeitet hat, sind wahrscheinlich verschiedene Warn/Fehler-Einstellungen. Es ist möglich, den Code ohne # zu kompilieren, einschließlich des Headers und mit der Deklaration von strcmp. Der Compiler kann die Typüberprüfung nicht durchführen, aber das Symbol wird immer noch vom Linker aufgelöst.

Sie können auch vermeiden, vollständig mit strcmp und auf einer Seite des Vergleichs

#include <string> 
#include <iostream> 

int main (int argc, char *argv[]) { 
    std::string command = argv[0]; 

    if(command != "./test") { 
    std::cout << "not equal" << endl; 
    } else { 
    std::cout << "equal" << endl; 
    } 
    return 0; 
} 

Mit einem std :: string schreiben bewirkt, dass der „./test“ string in ein std :: string umgewandelt werden Außerdem wird der Vergleich mit dem Operator == der Klasse std :: string durchgeführt.

+1

'string.h' ist C-Header; richtiger C++ Header ist 'cstring', da es alles in' namespace std' speichert. – Griwes

+0

@Griwes OK, gut zu wissen. Es scheint keinen Nachteil zu geben, string.h auch in C++ zu verwenden. –

+0

Ich nehme diese Antwort als akzeptiert, weil es Erklärungen gibt, die ich interessant fand – Barth

10

Sie sind nicht der richtige Header-Datei

#include <cstring> 
3

Sie haben einschließlich <cstring> aufzunehmen. <string> ist die Kopfzeile für C++ - Zeichenfolgen.

5

Sie müssen #include <cstring> (oder möglicherweise #include <string.h>.)

Viele Compiler sind unter anderem zusätzliche Standard-Header, wenn Sie ein anderes umfassen. Der Standard ermöglicht dies; Es liegt in Ihrer Verantwortung, die Header zu verwenden, die Deklarationen für Ihre Verwendung garantieren, nicht nur die Header, die die Deklarationen für Ihren Compiler enthalten.

+0

'string.h' ist C header; nur der richtige C++ - Header ist 'cstring', da er alles in' namespace std' speichert. – Griwes

+0

@DaveS, irgendein Beweis? Ich kann nichts darüber finden, dass sie im Standard veraltet sind. – Griwes

+0

@Griwes: Hoppla. Ich habe den Abschnitt komplett falsch gelesen. Ich habe den Kommentar gelöscht. –