Lá cờ dễ dãi làm gì?


121

Tôi chỉ tự hỏi -fpermissivecờ làm gì trong trình biên dịch g ++? Tôi đang nhận được:

error: lấy địa chỉ của [-fpermissive] tạm thời

mà tôi có thể giải quyết bằng cách đưa -fpermissivecờ cho trình biên dịch.

CHỈNH SỬA : Tôi vừa tìm thấy nguyên nhân gây ra phần lỗi địa chỉ tạm thời! Tôi sẽ sửa phần đó ngay bây giờ.

Câu trả lời:


146

Ngay từ tài liệu :

-fpermissive
Hạ cấp một số chẩn đoán về mã không phù hợp từ lỗi xuống cảnh báo. Do đó, việc sử dụng -fpermissivesẽ cho phép biên dịch một số mã không phù hợp.

Điểm mấu chốt: đừng sử dụng nó trừ khi bạn biết mình đang làm gì!


5
Tôi mong đợi nhiều thông tin hơn là trích dẫn hướng dẫn sử dụng + "không sử dụng nó cho đến khi bạn biết mình đang làm gì" từ câu trả lời được bình chọn cao nhất. Tôi không cần phải google cho điều này. Những trường hợp mã không phù hợp nào bị hạ cấp chính xác?
johannes_lalala

Không phải mã không phù hợp bị hạ cấp, nhưng chẩn đoán là từ lỗi đến cảnh báo. Một ví dụ được đưa ra bởi phần mở câu hỏi. Nếu bạn không biết các trường hợp cạnh có thể là gì, bạn không nên cân nhắc sử dụng nó.
cli_hlt

2
Xin lỗi bạn, không có gì xúc phạm, nhưng những lời khuyên như "đừng làm điều gì đó nếu bạn không biết hàm ý" là tầm thường và phù hợp với mọi câu hỏi và không trả lời được câu nào.
johannes_lalala

3
.. và xin lỗi, nhưng nếu chỉ trích dẫn hướng dẫn sử dụng mà không giải thích chi tiết thì không có ích gì. Đặc biệt là trong trường hợp hướng dẫn sử dụng rất thưa thớt.
johannes_lalala

50

Các -fpermissivelá cờ gây ra trình biên dịch để báo cáo một số điều mà thực sự là lỗi (nhưng được cho phép bởi một số trình biên dịch) như cảnh báo, mã giấy phép để biên dịch ngay cả khi nó không phù hợp với các quy tắc ngôn ngữ. Bạn thực sự nên khắc phục sự cố cơ bản. Đăng mẫu mã nhỏ nhất, có thể biên dịch để giải thích vấn đề.

-fpermissive
Hạ cấp một số chẩn đoán về mã không phù hợp từ lỗi xuống cảnh báo. Do đó, việc sử dụng -fpermissivesẽ cho phép biên dịch một số mã không phù hợp.


18

Khi bạn đã viết một thứ gì đó không được tiêu chuẩn ngôn ngữ cho phép (và do đó không thể thực sự là hành vi được xác định rõ ràng, đó là lý do đủ để không làm điều đó) nhưng tình cờ ánh xạ tới một số loại thực thi nếu bạn ngây thơ công cụ biên dịch, sau đó -fpermissivesẽ làm điều đó thay vì dừng lại với thông báo lỗi này. Trong một số trường hợp, chương trình sau đó sẽ hoạt động chính xác như bạn dự định ban đầu, nhưng bạn chắc chắn không nên dựa vào nó trừ khi bạn có một số lý do rất đặc biệt để không sử dụng một số giải pháp khác.


3
Một cái gì đó không được tiêu chuẩn ngôn ngữ cho phép vẫn có thể được xác định rõ ràng. Trong thực tế, hầu hết mọi trình biên dịch đều có các phần mở rộng được xác định rõ. Không nói đây là trường hợp với với tất cả các trường hợp mặc dù dễ dãi
MikeMB

8

Nếu bạn muốn một trường hợp sử dụng trong thế giới thực cho việc này, hãy thử biên dịch một phiên bản X Windows rất cũ - chẳng hạn như XFree86 hoặc XOrg từ phiên bản gốc 2004, ngay xung quanh phần tách - bằng cách sử dụng phiên bản "hiện đại" (ho) của gcc , chẳng hạn như 4.9.3.

Bạn sẽ nhận thấy CFLAGS xây dựng chỉ định cả "-ansi" và "-pedantic". Về lý thuyết, điều này có nghĩa là, "nổ tung nếu bất cứ điều gì thậm chí hơi vi phạm đặc điểm ngôn ngữ". Trong thực tế, loạt gcc 3.x không bắt được nhiều thứ như vậy và việc xây dựng nó với 4.9.3 sẽ để lại một lỗ hút trên mặt đất trừ khi bạn đặt CFLAGS và BOOTSTRAPCFLAGS thành "-fpermissive".

Sử dụng cờ đó, hầu hết các tệp C đó sẽ thực sự được xây dựng, cho phép bạn tự do chuyển sang phần phá hủy phụ thuộc vào phiên bản mà lexer sẽ tạo ra. =]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.