2011-10-25 18 views
13

thể trùng lặp:
Deprecated conversion from string constant to char * errorC++ - phản đối chuyển đổi từ chuỗi liên tục để 'char *'

Tôi cố gắng chạy cũ ++ mã C ngày hôm nay (mã này đi ngay trong năm 2004 :) . Nhưng bây giờ tôi nhận được thông báo lỗi này:

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 

Nguồn là "error.C" file:

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

Và nguồn gốc của tập tin "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 

Có bạn bất kỳ ý tưởng làm thế nào tôi có thể sửa chữa nó? Nếu có, vui lòng viết rõ ràng (tôi là người mới ...). Cảm ơn bạn!

+6

Không một lần nữa ... Xin vui lòng sử dụng tìm kiếm trước khi hỏi !! Gợi ý: 'char * s2 =" "' là gì sai – Xeo

Trả lời

24

Tôi nghĩ rằng cảnh báo của bạn đến từ mã này:

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

Vấn đề là xâu trong C++ có thể được coi là char* s, nhưng nó rất không an toàn để làm như vậy. Viết vào một mảng được xác định bởi một chuỗi ký tự kết quả trong hành vi không xác định (loại điều gây ra lỗ hổng bảo mật, lỗi chương trình, vv), nhưng một con trỏ ol 'char* thường xuyên sẽ cho phép bạn thực hiện kiểu viết này. Vì lý do này, nó là mạnh mẽ đề nghị bạn thực hiện tất cả char* s trỏ đến một chuỗi kiểu C thay vì là const char* s để trình biên dịch có thể kiểm tra để đảm bảo rằng bạn không cố gắng viết thư cho chúng. Trong trường hợp này, mã của bạn sẽ được viết tốt hơn như

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

Tuy nhiên, kể từ khi bạn đang sử dụng C++, một nhiều tốt hơn ý tưởng là chỉ để sử dụng std::string:

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

này hoàn toàn tránh được vấn đề, bởi vì loại C++ std::string có chính xác là const char* s trong các đối số của nó và tạo một bản sao sâu của chuỗi, vì vậy nếu bạn cố gắng thay đổi chuỗi, chuỗi đó được đảm bảo rằng bạn sẽ không truy tìm mảng ký tự gốc.

Hy vọng điều này sẽ hữu ích!

+0

... chắc chắn rồi! +1 – Ben

-3

Hãy thử

#include <iostream> 

trong tiêu đề.

+0

Rõ ràng mọi người không đọc bài đăng để bình chọn câu trả lời hay nhất. – Borzh

6

Bạn có một vài lựa chọn:

  • Fix mã của bạn để xâu không bao giờ được ngầm chuyển đổi sang char* (ví dụ "foo".). Chúng phải là const char*.

  • Thay đổi dòng lệnh trình biên dịch của bạn để bao gồm -Wno-write-strings. Đây là những gì phần -Wwrite-strings của thông báo lỗi là gợi ý tại.

Tôi thích tùy chọn đầu tiên hơn.

2

Có lỗi biên dịch, báo cáo rằng cerr không được xác định. Các câu trả lời khác cho bạn biết cách khắc phục các vấn đề được higlighted bằng các thông báo cảnh báo. Để biên dịch, bạn cần bao gồm iostream và sử dụng không gian tên std (hoặc thêm không gian tên trước tên luồng và endl).

Dưới đây là một số mã ví dụ:

#include <iostream> 

using namespace std; 

int main() 
{ 
    cerr << "test" << endl; 
} 
Các vấn đề liên quan