แฟล็ก fpermissive ทำอะไร?


121

ฉันแค่สงสัยว่า-fpermissiveแฟล็กทำอะไรในคอมไพเลอร์ g ++? ฉันได้รับ:

ข้อผิดพลาด: การรับที่อยู่ชั่วคราว [-fpermissive]

ซึ่งฉันสามารถแก้ปัญหาได้โดยให้ -fpermissiveแฟล็กกับคอมไพเลอร์

แก้ไข : ฉันเพิ่งพบสิ่งที่ทำให้เกิดข้อผิดพลาดที่อยู่ชั่วคราว! ฉันจะแก้ไขส่วนนั้นตอนนี้

คำตอบ:


146

จากเอกสาร :

-fpermissive
ดาวน์เกรดการวินิจฉัยบางอย่างเกี่ยวกับโค้ดที่ไม่เป็นไปตามข้อกำหนดจากข้อผิดพลาดเป็นคำเตือน ดังนั้นการใช้-fpermissiveจะอนุญาตให้คอมไพล์โค้ดที่ไม่เป็นไปตามข้อกำหนดบางอย่าง

บรรทัดล่าง: อย่าใช้มันเว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่!


5
ฉันคาดหวังข้อมูลมากกว่าใบเสนอราคา + "อย่าใช้จนกว่าคุณจะรู้ว่าคุณกำลังทำอะไร" จากคำตอบที่ได้รับการโหวตสูงสุด ฉันไม่จำเป็นต้องใช้ Google สำหรับสิ่งนี้ กรณีใดของรหัสที่ไม่เป็นไปตามข้อกำหนดที่ถูกปรับลดลงอย่างแน่นอน
johannes_lalala

ไม่ใช่รหัสที่ไม่เป็นไปตามข้อกำหนดจะถูกลดระดับลง แต่การวินิจฉัยมาจากข้อผิดพลาดไปจนถึงคำเตือน ตัวอย่างได้รับจากตัวเปิดคำถาม หากคุณไม่ทราบว่าขอบเคสเป็นอย่างไรคุณไม่ควรพิจารณาใช้มัน
cli_hlt

2
ผู้ชายขอโทษไม่มีความผิด แต่คำแนะนำเช่น "อย่าทำอะไรบางอย่างถ้าคุณไม่รู้ความหมาย" นั้นเป็นเรื่องเล็กน้อยและเหมาะกับทุกคำถามและไม่ตอบคำถามใด ๆ
johannes_lalala

3
.. และขอโทษด้วย แต่การอ้างคู่มือโดยไม่ละเอียดเลยนั้นไม่เป็นประโยชน์ โดยเฉพาะอย่างยิ่งในกรณีที่คู่มือมีความเบาบางมาก
johannes_lalala

50

-fpermissiveธงสาเหตุของคอมไพเลอร์จะรายงานบางสิ่งบางอย่างที่เป็นจริงข้อผิดพลาด ( แต่จะได้รับอนุญาตโดยคอมไพเลอร์บางคน) เป็นคำเตือนรหัสใบอนุญาตในการรวบรวมถึงแม้ว่ามันจะไม่สอดคล้องกับกฎระเบียบของภาษา คุณควรแก้ไขปัญหาพื้นฐานจริงๆ โพสต์ตัวอย่างโค้ดที่เล็กที่สุดที่รวบรวมได้ซึ่งแสดงให้เห็นถึงปัญหา

-fpermissive
ดาวน์เกรดการวินิจฉัยบางอย่างเกี่ยวกับโค้ดที่ไม่เป็นไปตามข้อกำหนดจากข้อผิดพลาดเป็นคำเตือน ดังนั้นการใช้-fpermissiveจะอนุญาตให้คอมไพล์โค้ดที่ไม่เป็นไปตามข้อกำหนดบางอย่าง


18

เมื่อคุณเขียนสิ่งที่ไม่ได้รับอนุญาตตามมาตรฐานภาษา (ดังนั้นจึงไม่สามารถกำหนดพฤติกรรมที่ชัดเจนได้ซึ่งเป็นเหตุผลที่เพียงพอที่จะไม่ทำ) แต่เกิดขึ้นกับการแมปกับไฟล์ปฏิบัติการบางประเภทหากป้อนอย่างไร้เดียงสา เอนจินคอมไพล์แล้ว-fpermissiveจะทำแบบนั้นแทนที่จะหยุดด้วยข้อความแสดงข้อผิดพลาดนี้ ในบางกรณีโปรแกรมจะทำงานตามที่คุณตั้งใจไว้ในตอนแรก แต่คุณไม่ควรพึ่งพามันอย่างแน่นอนเว้นแต่คุณจะมีเหตุผลพิเศษที่จะไม่ใช้วิธีแก้ปัญหาอื่น ๆ


3
สิ่งที่ไม่ได้รับอนุญาตตามมาตรฐานภาษายังคงสามารถกำหนดได้ดี ในความเป็นจริงเกือบทุกคอมไพเลอร์มีส่วนขยายที่กำหนดไว้อย่างดี ไม่ได้บอกว่าเป็นกรณีนี้กับทุกกรณีที่อนุญาต
MikeMB

8

หากคุณต้องการกรณีการใช้งานในโลกแห่งความเป็นจริงสำหรับสิ่งนี้ลองรวบรวม X Windows เวอร์ชันเก่ามากเช่น XFree86 หรือ XOrg จาก aboout 2004 ประมาณแยกโดยใช้ gcc เวอร์ชัน "ทันสมัย" (ไอ) เช่น 4.9.3.

คุณจะสังเกตเห็นการสร้าง CFLAGS ระบุทั้ง "-ansi" และ "-pedantic" ในทางทฤษฎีหมายความว่า "ระเบิดหากมีสิ่งใดละเมิดข้อกำหนดของภาษาแม้แต่เล็กน้อย" ในทางปฏิบัติชุด 3.x ของ gcc ไม่ได้จับสิ่งของประเภทนั้นมากนักและการสร้างด้วย 4.9.3 จะทำให้มีช่องสูบบุหรี่อยู่ที่พื้นเว้นแต่คุณจะตั้งค่า CFLAGS และ BOOTSTRAPCFLAGS เป็น "-fpermissive"

การใช้แฟล็กนั้นไฟล์ C เหล่านั้นส่วนใหญ่จะสร้างขึ้นจริงทำให้คุณมีอิสระที่จะย้ายไปยัง wreckage ที่ขึ้นอยู่กับเวอร์ชันที่ lexer จะสร้างขึ้น =]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.