2011-10-25 26 views
13

Eventuali duplicati:
Deprecated conversion from string constant to char * errorC++ - conversione deprecato da costante di stringa a 'char *'

ho cercato di correre vecchio codice C++ di oggi (questo codice andato a destra nel 2004 :) . Ma ora ho questo messaggio di errore:

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 

Fonte di file "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); 
} 
... 

E fonte di file "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 

Avete qualche idea su come potrei risolverlo? Se sì, scrivilo chiaramente (sono novizio ...). Grazie!

+6

Non di nuovo ... Si prega di utilizzare la ricerca prima di chiedere !! Suggerimento: 'char * s2 =" "' è ciò che è sbagliato – Xeo

risposta

24

penso che i tuoi avvertimenti sono provenienti da questo codice:

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

Il problema è che le stringhe letterali in C++ possono essere trattati come char* s, ma è molto pericoloso per farlo. Scrivere in un array definito da un risultato stringa letterale in Undefined Behaviour (il tipo di cosa che causa buchi di sicurezza, arresti anomali del programma, ecc.), Ma un normale puntatore o 'char* consentirebbe di fare questo tipo di scrittura. Per questo motivo, è fortemente suggerito di eseguire tutti gli char* s che puntano a una stringa in stile C anziché const char* in modo che il compilatore possa verificare che non si tenti di scrivere su di essi. In questo caso, il codice sarebbe meglio scritto come

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

Tuttavia, dal momento che si sta utilizzando C++, una molto migliore idea è solo quello di utilizzare std::string:

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

Questo evita completamente il problema, perché il tipo C++ std::string ha correttamente const char* s nei suoi argomenti e crea una copia profonda della stringa, quindi se provi a mutare la stringa è garantito che non stai andando a distruggere la matrice originale di caratteri.

Spero che questo aiuti!

+0

... lo fa sicuramente! +1 – Ben

-3

Prova

#include <iostream> 

nell'intestazione.

+0

Ovviamente le persone non leggono il post per votare la risposta migliore. – Borzh

6

avete alcune opzioni:

  • risolvere il tuo codice in modo che le stringhe letterali non vengono mai implicitamente convertiti in char* (ad es. "foo"). Dovrebbero essere const char*.

  • Modificare la riga di comando del compilatore per includere -Wno-write-strings. Questo è ciò che suggerisce la parte -Wwrite-strings del messaggio di errore.

Preferirei la prima opzione.

2

C'è un errore di compilazione, che indica che cerr non è definito. Altre risposte ti dicono come risolvere i problemi evidenziati dai messaggi di avvertimento. Per compilare è necessario includere iostream e utilizzare lo spazio dei nomi std (o aggiungere lo spazio dei nomi prima del nome del flusso e di endl).

Ecco qualche esempio di codice:

#include <iostream> 

using namespace std; 

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