2012-01-12 739 views
84

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

error: taking address of temporary [-fpermissive]

mà tôi có thể giải quyết bằng cách cung cấp cờ -fpermissive cho trình biên dịch.

EDIT: 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ờ.

Trả lời

106

Ngay từ the docs:

-fpermissive
Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive will allow some nonconforming code to compile.

Bottom line: không sử dụng nó trừ khi bạn biết những gì bạn đang làm!

38

-fpermissive flag làm cho trình biên dịch báo cáo một số điều thực sự là lỗi (nhưng được phép bởi một số trình biên dịch) làm cảnh báo, cho phép mã biên dịch ngay cả khi không tuân thủ các quy tắc ngôn ngữ. Bạn thực sự cần khắc phục vấn đề cơ bản. Đăng mẫu mã nhỏ nhất, có thể biên dịch để chứng minh sự cố.

-fpermissive
Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive will allow some nonconforming code to compile.

13

Khi bạn đã viết nội dung nào đó không được phép theo tiêu chuẩn ngôn ngữ (và do đó không thể thực sự được xác định rõ hành vi, đó là lý do đủ để không làm điều đó) nhưng sẽ xảy ra với bản đồ để một số loại của thực thi nếu được nạp một cách vô lý đối với công cụ biên dịch, thì -fpermissive sẽ thực hiện thay vì dừng 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.

+1

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

4

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

Bạn sẽ thấy CFLAGS xây dựng chỉ định cả "-ansi" và "-pantic". Về lý thuyết, điều này có nghĩa là, "thổi phồng lên nếu bất cứ điều gì thậm chí hơi vi phạm đặc tả ngôn ngữ". Trong thực tế, chuỗi gx 3.x không nắm bắt được nhiều thứ như thế, và xây dựng nó với 4.9.3 sẽ để lại một lỗ hút thuốc trong lòng đấ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ự tạo, để bạn tự do di chuyển sang đống đổ nát phụ thuộc phiên bản mà từ khoá sẽ tạo. =]