2012-06-21 15 views
8

que tienen un programa básico que compara dos cadenas:¿Por qué strcmp es desconocido para clang?

#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; 
} 

compila con gcc, pero no con sonido metálico:

> 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. 

¿Por qué no se compile con sonido metálico?

EDITAR: La gente se está volviendo dura en el desbordamiento de la pila, hasta el punto que estoy dudando en publicar una pregunta. La pregunta anterior tiene una respuesta simple, está bien, pero ¿es normal rechazar las preguntas (¡dos veces en el primer minuto!) Porque tienen una respuesta simple pero no obvia.

+0

No tengo ni idea de por qué las personas votaron negativamente. Está claramente establecido y es una pregunta válida. – aschepler

+0

"Esta pregunta no muestra ningún esfuerzo de investigación". El primer hit en Google para "strcmp" tiene un ejemplo de código con '#include ' (que también es una solución válida). La investigación mínima habría respondido a esta pregunta. Es por eso que lo rechacé. Las preguntas triviales disminuyen el valor de este sitio. –

+2

Hacer un ejemplo mínimo y comparar resultados en dos compiladores es esfuerzo de investigación. – aschepler

Respuesta

10

Uso

#include <string.h> 

o

#include <cstring> 

en lugar de

#include <string> 

La cadena cabecera es para el std :: string de C++. string.h es para cadenas C * terminadas en cero. cstring es como string.h pero para C++.

La razón por la que funcionó con gcc es probablemente una configuración diferente de nivel de advertencia/error. Es posible compilar el código sin #incluir el encabezado y tener la declaración de strcmp. El compilador no podrá realizar la comprobación de tipos, pero el símbolo aún resuelve el símbolo.

También puede evitar el uso de strcmp completamente y escribir

#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; 
} 

El uso de un std :: string en un lado de la comparación hará que la cadena "./test" que ha de convertirse en un std :: string también y la comparación será hecha por el operador == de la clase std :: string.

+1

'string.h' es el encabezado C; el encabezado correcto de C++ es 'cstring', ya que mantiene todo en' namespace std'. – Griwes

+0

@Griwes OK, es bueno saberlo. Parece que no hay ninguna desventaja de usar string.h incluso en C++. –

+0

Tomo esta respuesta como aceptada porque da explicaciones que encontré interesante – Barth

10

No está incluido el archivo de cabecera correcta

#include <cstring> 
3

Tienes que incluir <cstring>. <string> es el encabezado de las cadenas de C++.

5

Necesitas #include <cstring> (o posiblemente #include <string.h>.)

Muchos compiladores incluyen cabeceras estándar adicionales cuando se incluye otra. El estándar permite esto; es su responsabilidad usar los encabezados que garantizan las declaraciones de lo que usa, no solo los encabezados que tienen las declaraciones para su compilador.

+0

'string.h' es C header; solo el encabezado correcto de C++ es 'cstring', ya que mantiene todo en' namespace std'. – Griwes

+0

@DaveS, ¿alguna prueba? No puedo encontrar nada sobre que estén en desuso en el estándar. – Griwes

+0

@Griwes: Ooops. Leí completamente la sección. He borrado el comentario. –

Cuestiones relacionadas