Jadi saya sedang mengerjakan basis kode yang sangat besar, dan baru-baru ini ditingkatkan menjadi gcc 4.3, yang sekarang memicu peringatan ini:
peringatan: konversi yang tidak digunakan lagi dari string konstan ke 'char *'
Jelas, cara yang benar untuk memperbaikinya adalah dengan menemukan setiap deklarasi suka
char *s = "constant string";
atau panggilan fungsi seperti:
void foo(char *s);
foo("constant string");
dan membuat mereka const char
petunjuk. Namun, itu berarti menyentuh 564 file, minimum, yang bukan tugas yang ingin saya lakukan pada saat ini. Masalahnya sekarang adalah saya sedang berlari -werror
, jadi saya perlu cara untuk meredam peringatan ini. Bagaimana saya bisa melakukan itu?
Jawaban:
Saya percaya melewatinya
-Wno-write-strings
ke gcc akan menekan peringatan ini.sumber
#pragma GCC diagnostic ignored "-Wwrite-strings"
.Fungsi apa pun yang Anda
"I am a string literal"
gunakan string literal harus digunakanchar const *
sebagai jenis alih-alihchar*
.Jika Anda akan memperbaiki sesuatu, perbaiki dengan benar.
Penjelasan:
Anda tidak dapat menggunakan string literal untuk menginisialisasi string yang akan dimodifikasi, karena mereka bertipe
const char*
. Casting pergi constness untuk kemudian memodifikasi mereka adalah perilaku undefined , sehingga Anda harus menyalin Andaconst char*
stringchar
denganchar
menjadi dinamis dialokasikanchar*
string dalam rangka untuk mengubah mereka.Contoh:
sumber
char *
/const char *
, jadi dalam hal ini saya biasanya menggunakan.char*
bahkan untuk string yang tidak akan diubah. Jika Anda mengambil parameter sebagaichar const*
dan meneruskannya ke fungsi standar,char*
Anda akan menemukan itu. Jika fungsi perpustakaan tidak akan memanipulasi string, Anda dapat membuangconst
.Saya memiliki masalah yang sama, saya menyelesaikannya seperti ini:
Apakah ini cara yang tepat untuk menyelesaikan ini? Saya tidak memiliki akses untuk
foo
mengadaptasikannya untuk menerimaconst char*
, meskipun itu akan menjadi solusi yang lebih baik (karenafoo
tidak berubahm
).sumber
char **
diPyArg_ParseTupleAndKeywords
saya melakukan sesuatu seperti ini:static char kw[][16] = {"mode", "name", "ip", "port"}; static char * kwlist[] = {kw[0], kw[1], kw[2], kw[3], NULL};
Lihat dukungan Pragma Diagnostik gcc , dan daftar opsi peringatan -W (diubah: tautan baru ke opsi peringatan ).
Untuk gcc, Anda dapat menggunakan
#pragma warning
arahan seperti yang dijelaskan di sini .sumber
Jika basis kode aktif, Anda mungkin masih ingin meningkatkan basis kode. Tentu saja, melakukan perubahan secara manual tidak layak tetapi saya percaya bahwa masalah ini dapat diselesaikan sekali dan untuk semua dengan satu
sed
perintah tunggal . Saya belum mencobanya, jadi ambil yang berikut dengan sebutir garam.Ini mungkin tidak menemukan semua tempat (bahkan tidak mempertimbangkan panggilan fungsi) tetapi itu akan mengurangi masalah dan memungkinkan untuk melakukan beberapa perubahan yang tersisa secara manual.
sumber
Saya tidak bisa menggunakan saklar kompiler. Jadi saya telah mengubah ini:
untuk ini:
sumber
Berikut ini cara melakukannya dalam file, jadi Anda tidak perlu memodifikasi Makefile Anda.
Anda kemudian dapat ...
sumber
Menggantikan
dengan
atau jika Anda memanggil fungsi:
ganti ini dengan
sumber
Dari pada:
Ini bekerja:
sumber
Di C ++, gunakan
const_cast
seperti di bawah inisumber
Test string
adalah string const. Jadi Anda bisa menyelesaikannya seperti ini:atau:
sumber
Mengapa tidak menggunakan tipe casting saja?
sumber
Apakah typecasting dari string konstan ke pointer char yaitu
sumber
Di C ++, Ganti:
dengan:
Dan jika Anda ingin membandingkannya:
sumber
Bekerja dengan Arduino Sketch, saya memiliki fungsi yang menyebabkan peringatan saya.
Untuk menghentikan peringatan, saya menambahkan const di depan karakter * dan karakter *.
Semua peringatan hilang.
sumber
lihat situasi ini:
perhatikan bidang nama, di gcc kompilasi tanpa peringatan, tetapi di g ++ itu akan, saya tidak tahu mengapa.
sumber
Anda juga dapat membuat string yang dapat ditulis dari konstanta string dengan memanggil
strdup()
.Misalnya, kode ini menghasilkan peringatan:
Namun, kode berikut ini tidak (itu membuat salinan string di heap sebelum meneruskannya ke
putenv
):Dalam hal ini (dan mungkin di sebagian besar lainnya) mematikan peringatan adalah ide yang buruk - itu ada karena suatu alasan. Alternatif lain (membuat semua string dapat ditulis secara default) berpotensi tidak efisien.
Dengarkan apa yang dikatakan kompiler!
sumber
putenv()
penuh - itu bukan pilihan contoh yang baik (setidaknya, tidak tanpa banyak diskusi tentang apa yangputenv()
ada daripada dalam jawaban ini). Ini adalah diskusi yang terpisah. (Perhatikan bahwa spesifikasi POSIX untuk perilakuputenv()
bermasalah, berdasarkan pada implementasi warisan dari sebelum POSIX didefinisikan.) IIRC, ada bug dalam rilis terbaru (milenium) Perpustakaan GNU C yang berkaitan denganputenv()
perubahan perilaku, dan diubah kembali.)cukup gunakan opsi -w untuk g ++
contoh:
g ++ -w -o simple.o simple.cpp -lpthread
Ingat ini tidak menghindari penghentian melainkan mencegah menampilkan pesan peringatan di terminal.
Sekarang jika Anda benar-benar ingin menghindari penghentian penggunaan kata kunci const seperti ini:
sumber
Mengapa Anda tidak menggunakan
-Wno-deprecated
opsi ini untuk mengabaikan pesan peringatan yang sudah usang?sumber
Ini adalah masalah Anda yang sebenarnya, IMO. Anda dapat mencoba beberapa cara otomatis untuk berpindah dari (char *) ke (const char *) tetapi saya akan menggunakan uang untuk itu tidak hanya bekerja. Anda harus melibatkan manusia setidaknya untuk beberapa pekerjaan. Untuk jangka pendek, abaikan saja peringatan (tapi IMO biarkan, atau tidak akan pernah diperbaiki) dan cukup hapus -Werror.
sumber
Terima kasih atas bantuannya. Memilih dari sana-sini solusi ini. Kompilasi ini bersih. Belum menguji kodenya. Besok mungkin...
Saya tahu, hanya ada 1 item dalam array timeServer. Tetapi mungkin ada lebih banyak. Sisanya dikomentari untuk saat ini untuk menghemat memori.
sumber
perhatikan bidang nama, di gcc kompilasi tanpa peringatan, tetapi di g ++ itu akan, saya tidak tahu mengapa.
di
gcc (Compiling C)
, -Wno-write-string aktif secara default.di
g++ (Compiling C++)
-Wwrite-string aktif secara defaultInilah sebabnya mengapa ada perilaku yang berbeda. Bagi kami menggunakan makro
Boost_python
menghasilkan peringatan seperti itu. Jadi kami menggunakan-Wno-write-strings
ketika mengkompilasi C ++ karena kami selalu menggunakan-Werror
sumber
Nyatakan string sebagai
const
kehendak memecahkan masalah:sumber