Apa fungsi bendera fpermissive?

121

Saya hanya ingin tahu apa yang dilakukan -fpermissiveflag pada kompiler g ++? Saya mendapatkan:

error: mengambil alamat sementara [-fpermissive]

yang bisa saya selesaikan dengan memberikan -fpermissivebendera ke kompiler.

EDIT : Saya baru saja menemukan apa yang menyebabkan bagian kesalahan alamat sementara! Saya akan memperbaiki bagian itu sekarang.

mmirzadeh.dll
sumber

Jawaban:

146

Langsung dari dokumen :

-fpermissive
Turunkan beberapa diagnostik tentang kode yang tidak sesuai dari kesalahan menjadi peringatan. Jadi, menggunakan -fpermissiveakan memungkinkan beberapa kode yang tidak sesuai untuk dikompilasi.

Intinya: jangan gunakan kecuali Anda tahu apa yang Anda lakukan!

cli_hlt
sumber
5
Saya mengharapkan lebih banyak informasi daripada manual kutipan + "jangan gunakan sampai Anda tahu apa yang Anda lakukan" dari jawaban pilihan tertinggi. Saya tidak perlu google untuk ini. Kasus kode nonkonforman mana yang diturunkan secara tepat?
johannes_lalala
Bukan kode nonconformant yang diturunkan, tetapi diagnostik dari kesalahan menjadi peringatan. Contoh diberikan oleh pembuka pertanyaan. Jika Anda tidak tahu seperti apa casing edge itu, Anda tidak boleh mempertimbangkan untuk menggunakannya.
cli_hlt
2
Maaf kawan, jangan tersinggung, tapi nasehat seperti "jangan lakukan sesuatu jika kamu tidak tahu implikasinya" adalah sepele dan cocok untuk setiap pertanyaan dan tidak menjawab apapun.
johannes_lalala
3
.. dan maaf, tetapi hanya mengutip manual tanpa menjelaskan sama sekali tidak membantu. Terutama dalam kasus dimana manual sangat jarang.
johannes_lalala
50

The -fpermissiveflag menyebabkan compiler untuk melaporkan beberapa hal yang sebenarnya kesalahan (tapi diizinkan oleh beberapa kompiler) sebagai peringatan, kode izin untuk mengkompilasi bahkan jika itu tidak sesuai dengan aturan bahasa. Anda benar-benar harus memperbaiki masalah yang mendasarinya. Posting contoh kode terkecil yang dapat dikompilasi yang menunjukkan masalah tersebut.

-fpermissive
Turunkan beberapa diagnostik tentang kode yang tidak sesuai dari kesalahan menjadi peringatan. Jadi, menggunakan -fpermissiveakan memungkinkan beberapa kode yang tidak sesuai untuk dikompilasi.

David Schwartz
sumber
18

Ketika Anda telah menulis sesuatu yang tidak diperbolehkan oleh standar bahasa (dan karena itu tidak dapat benar-benar merupakan perilaku yang terdefinisi dengan baik, yang merupakan alasan yang cukup untuk tidak melakukannya) tetapi kebetulan memetakan ke beberapa jenis yang dapat dieksekusi jika diberi makan secara naif mesin kompilasi, kemudian -fpermissiveakan melakukan hal itu alih-alih berhenti dengan pesan kesalahan ini. Dalam beberapa kasus, program kemudian akan berperilaku persis seperti yang Anda inginkan, tetapi Anda tidak boleh mengandalkannya kecuali Anda memiliki alasan yang sangat khusus untuk tidak menggunakan solusi lain.

kiri sekitar
sumber
3
Sesuatu yang tidak diperbolehkan oleh standar bahasa masih bisa didefinisikan dengan baik. Nyatanya hampir setiap kompilator memiliki ekstensi yang terdefinisi dengan baik. Tidak mengatakan ini adalah kasus dengan semua contoh permisif meskipun
MikeMB
8

Jika Anda menginginkan kasus penggunaan dunia nyata untuk ini, coba kompilasi versi X Windows yang sangat lama-- katakanlah, XFree86 atau XOrg dari sekitar tahun 2004, tepat di sekitar-- menggunakan versi gcc "modern" (batuk) , seperti 4.9.3.

Anda akan melihat CFLAGS build menentukan "-ansi" dan "-pedantic". Secara teori, ini berarti, "meledak jika ada yang melanggar spesifikasi bahasa". Dalam praktiknya, seri 3.x dari gcc tidak menangkap banyak hal semacam itu, dan membangunnya dengan 4.9.3 akan meninggalkan lubang berasap di tanah kecuali Anda menyetel CFLAGS dan BOOTSTRAPCFLAGS ke "-fpermissive".

Dengan menggunakan flag tersebut, sebagian besar file C tersebut akan benar-benar dibuat, sehingga Anda bebas untuk beralih ke reruntuhan yang bergantung pada versi yang akan dihasilkan oleh lexer. =]

breakpoint
sumber