Tôi có một hành vi kỳ lạ của g++ khi nó hiển thị cảnh báo về tùy chọn dòng lệnh không được nhận dạng khi bất kỳ cảnh báo nào khác được hiển thị.
例子:
struct Foo{thanh int ảo() = 0;};
struct Bar:public Foo{int bar() {return 0;} };
int chính(){}
sử dụng g++-5 -Wsuggest-override -Wno-c99-extensions -std=c++11 a.cpp
甚至 g++-5 -Wsuggest-override -Wno- biên dịch c99-extensions a.cpp
trình diễn:
a.cpp:2:27: cảnh báo: 'virtual int Bar::bar()' có thể được đánh dấu ghi đè [-Wsuggest-override]
struct Bar:public Foo{int bar() {return 0;} };
^
cc1plus: cảnh báo: tùy chọn dòng lệnh không được nhận dạng '-Wno-c99-extensions'
Đã thêm: Khi tôi sử dụng g++-5-Wno-c99-tiện ích mở rộng a.cpp
Không có cảnh báo/lỗi khi biên dịch nên tùy chọn này sử dụng CHECK_CXX_COMPILER_FLAG
Kiểm tra qua CMAKE/p>
Điều này làm phiền tôi vì chúng tôi sử dụng Werror nhưng thông qua Wno-error=... ngoại lệ, nó sẽ thoát khi có bất kỳ cảnh báo nào (không có lỗi) cho biết "tùy chọn dòng lệnh không được nhận dạng"
Điều này có được biết/dự kiến không? Làm thế nào để ngăn chặn nó?
Nếu bạn không muốn nhận cảnh báo về các tùy chọn dòng lệnh không được nhận dạng, đừng sử dụng các tùy chọn dòng lệnh không được nhận dạng:-Wno-c99-tiện ích mở rộng
Không bao giờ là tùy chọn GCC hợp lệ (tôi tin rằng đây là tiếng kêu). Chỉ cần loại bỏ nó khỏi lệnh xây dựng.
Về lý do tại sao chỉ khi bạn cókhác Hành vi này có vẻ phản trực giác, nhưngnó thực sự là có chủ ý và được ghi lại :
Cảnh báo "tùy chọn dòng lệnh không được nhận dạng" không được đưa ra cho -Wno-foo
Kể từ GCC 4.4 và như được giải thích trong hướng dẫn sử dụng GCC: khi yêu cầu tùy chọn cảnh báo không được nhận dạng (-Wunknown-cảnh báo
), GCC đưa ra chẩn đoán cho biết tùy chọn này không được nhận dạng. -Không-
được sử dụng, hành vi hơi khác một chút: không có chẩn đoán nào được đưa ra cho -Wno-không rõ-cảnh báo
trừ khi các chẩn đoán khác đang được thực hiện. Điều này cho phép sử dụng chẩn đoán mới. -Không-
tùy chọn với trình biên dịch cũ, nhưng nếu có sự cố xảy ra, trình biên dịch sẽ cảnh báo rằng có một tùy chọn không được nhận dạng. (Xem PR28322 để biết lịch sử của sự thay đổi này)
Điều này có thể phá vỡ các bài kiểm tra cấu hình kiểm tra -Wno-foo
options. Giải pháp là kiểm tra dạng tích cực (-Wfoo
) hoặc kiểm tra bằng cách sử dụng một trường hợp kiểm thử kích hoạt một số cảnh báo khác.
Trên thực tế, có một số kết quả trên Google về các chuỗi danh sách gửi thư trong đó các nhà phát triển phần mềm đã gặp phải "sự cố" này, cụ thể là CMake và đã thực hiện các bản sửa lỗi nhỏ đối với tập lệnh xây dựng của họ để "khắc phục" nó.
Tôi là một lập trình viên xuất sắc, rất giỏi!