2011-10-25 11 views
13

Duplicar posibles:
Deprecated conversion from string constant to char * errorC++ - la conversión en desuso a partir constante a 'char *' cadena

Traté de correr antiguo código C++ hoy (este código ha ido bien en 2004 :) . Pero ahora tengo este mensaje de error:

make[1]: Entering directory `/home/thehost/Plocha/lpic-1.3.1/lpic/src' 
source='error.C' object='error.o' libtool=no \ 
depfile='.deps/error.Po' tmpdepfile='.deps/error.TPo' \ 
depmode=gcc3 /bin/bash ../../config/depcomp \ 
g++ -DHAVE_CONFIG_H -I. -I. -I../.. -g -O2 -Wno-deprecated -g -O2 -c -o error.o `test -f 'error.C' || echo './'`error.C 
error.C: In constructor ‘error_handler::error_handler(const char*, char*)’: 
error.C:49:7: error: ‘cerr’ was not declared in this scope 
error.C:58:11: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite- strings] 
error.C:58:11: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite- strings] 
error.C:58:11: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite- strings] 
error.C:58:11: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite- strings] 
make[1]: *** [error.o] Error 1 
make[1]: Leaving directory `/home/thehost/Plocha/lpic-1.3.1/lpic/src' 
make: *** [all-recursive] Error 1 

Fuente de archivo "error.C":

... 
#include <error.h> 

int error_handler::error_number = 0; 
int error_handler::message_number = 0; 
int error_handler::debug_number = 0; 
int error_handler::Q_debug  = 1; 
int error_handler::object_number = 0; 
int error_handler::tab   = 33; 

error_handler::error_handler(const char *name, char *error_file_name) 
{ 
    errname = new char [filename_size]; 
    strcpy(errname,error_file_name); 

    errfile.open(errname,ios::app); 

    if (!errfile) 
    { 
     cerr << "error_handler: cannot open error file " << errname << endl; 
     exit(1); 
    } 

    errfile.close(); 

    my_name = name; 
    object_number++; 

    debug(""); 
} 


void error_handler::error(char* s1, char* s2, char *s3, char *s4) 
{ 
    error_number++ ; 

    errfile.open(errname,ios::app); 
    errfile.setf(ios::left); 

    errfile << "FAILURE: " << setw(tab) << my_name << "  " << s1 << ' ' << s2 
    << s3 << s4 << endl; 

    errfile.close(); 

exit(1); 
} 
... 

y la fuente de archivo "error.h":

... 
using namespace std; 

class error_handler { 
static int error_number; 
static int message_number; 
static int Q_debug; 
static int debug_number; 
static int object_number; 
const char *my_name; 

char  *errname; 

ofstream errfile; 
static int tab; 
public: 
error_handler(const char *, char *error_file_name); 


void error(char* s1, char* s2="", 
     char* s3="", char* s4=""); 
void error(char* s1, double d2, 
     char* s3="", char* s4=""); 

void message(char* m1, 
    char* m2="", char* m3="", char* m4=""); 
void message(char* m1, double m2, 
    char* m3="", char* m4=""); 
void message(char* m1, double m2, char* m3, double m4); 
void message(char* m1, double m2, char* m3, double m4, 
    char* m5, double m6, char* m7, double m8); 
void message(char* m1, double m2, double m3, double m4, double m5); 
void message(char* m1, double m2, double m3, double m4); 
void message(char* m1, double m2, char* m3, double m4, char* m5, double m6); 
void message(char *s1, double d2, double d3); 
void message(char *s1, char *s2, double d3); 

void debug(char* m1, 
     char* m2="", char* m3="", char* m4=""); 
void debug(char* m1, double m2, 
     char* m3="", char* m4=""); 
void debug(char* m1 , double m2, char* m3, double m4); 
void debug(char* m1 , double m2, char* m3, double m4, char* m5, double m6); 
}; 

#endif 

usted tiene Alguna idea de cómo podría solucionarlo? En caso afirmativo, escríbalo con claridad (soy novato ...). ¡Gracias!

+6

No de nuevo ... Por favor, utilice la búsqueda antes de pedir !! Sugerencia: 'char * s2 =" "' es lo que está mal – Xeo

Respuesta

24

creo que sus advertencias son procedentes de este código:

void message(char* m1, 
    char* m2="", char* m3="", char* m4=""); 

La cuestión es que los literales de cadena en C++ pueden ser tratados como char* s, pero es muy peligroso hacerlo. Escribir en una matriz definida por un literal de cadena da como resultado un comportamiento indefinido (el tipo de cosas que causa agujeros de seguridad, bloqueos de programa, etc.), pero un puntero ol 'char* normal le permitiría hacer este tipo de escritura. Por esta razón, es fuertemente sugirió que haga todos los char* s que apuntarían a una cadena de estilo C en lugar de ser const char* s para que el compilador pueda verificar para asegurarse de que no intente escribir en ellos. En este caso, el código sería mejor escribir como

void message(char* m1, 
    const char* m2="", const char* m3="", const char* m4=""); 

Sin embargo, ya que usted está usando C++, un mucho mejor idea es sólo para usar std::string:

void message(std::string m1, 
    std::string m2="", std::string m3="", std::string m4=""); 

Esto evita por completo la problema, porque el tipo C++ std::string tiene correctamente const char* s en sus argumentos y hace una copia profunda de la cadena, por lo que si intentas mutar la cadena, se garantiza que no vas a destruir la matriz original de caracteres.

Espero que esto ayude!

+0

... ¡seguro que sí! +1 – Ben

-3

Trate

#include <iostream> 

en la cabecera.

+0

Obviamente, las personas no leen la publicación para votar la mejor respuesta. – Borzh

6

Usted tiene algunas opciones:

  • arreglar su código para que los literales de cadena nunca se convierten implícitamente a char* (por ejemplo "foo".). Deberían ser const char*.

  • Cambie su línea de comandos de compilación para incluir -Wno-write-strings. Esto es en lo que se insinúa la parte -Wwrite-strings del mensaje de error.

Preferiría la primera opción.

2

Hay un error de compilación, que indica que cerr no está definido. Otras respuestas te dicen cómo solucionar problemas resaltados por mensajes de advertencia. Para compilar, debe incluir iostream y usar el espacio de nombres std (o agregar espacio de nombres antes del nombre de la secuencia y endl).

Aquí hay un código de ejemplo:

#include <iostream> 

using namespace std; 

int main() 
{ 
    cerr << "test" << endl; 
}