Gần đây, chúng tôi đã kích hoạt -Wall
cho một dự án. Nó được kích hoạt khi GCC ở 4.7 hoặc cao hơn (hoặc Clang) vì chúng ta có thể sử dụng GCC diagnostic
để quản lý đầu ra từ các cảnh báo nâng lên. Chúng tôi muốn quản lý chúng từ mã nguồn và không thông qua đối số dòng lệnh. (Chúng tôi không muốn gây ô nhiễm dòng lệnh hoặc yêu cầu người dùng thư viện tìm lại những gì cần thiết).GCC không tôn trọng 'pragma GCC diagnostic' để cảnh báo im lặng
Dưới GCC 4.8 và 5.1, chúng tôi đang bắt cảnh báo đã được vô hiệu hóa trong một khối chẩn đoán GCC cho -Wunused-variable
, -Wunused-value
, -Wunused-function
và -Wunknown-pragmas
. Cả hai GCC chấp nhận -fopenmp
, và cả hai xác định _OPENMP
để đáp ứng với nó, vì vậy tôi khá chắc chắn nó không bao giờ chúng ta sẽ thấy một -Wunknown-pragmas
để đáp ứng với #prgam omp ...
(nó là tàn tật, nhưng nó không phải là chưa biết).
g++ -DNDEBUG -g2 -O3 -Wall -march=native -pipe -c nbtheory.cpp
nbtheory.cpp:655:0: warning: ignoring #pragma omp parallel [-Wunknown-pragmas]
#pragma omp parallel
^
nbtheory.cpp:656:0: warning: ignoring #pragma omp sections [-Wunknown-pragmas]
#pragma omp sections
^
...
Trong trường hợp đặc biệt này, các file nbtheroy.cpp
có bảo vệ sau tại chỗ để giúp quản lý cảnh báo rằng (chỉ bộ phận liên quan được hiển thị, nhưng bạn có thể nhìn thấy tất cả mọi thứ từ the GitHub link):
// Defines GCC_DIAGNOSTIC_AWARE if GCC 4.7 or above.
#include <misc.h>
...
#if GCC_DIAGNOSTIC_AWARE
# pragma GCC diagnostic ignored "-Wunknown-pragmas"
#endif
...
Integer ModularRoot(const Integer &a, const Integer &dp, const Integer &dq,
const Integer &p, const Integer &q, const Integer &u)
{
Integer p2, q2;
#pragma omp parallel
#pragma omp sections
{
#pragma omp section
p2 = ModularExponentiation((a % p), dp, p);
#pragma omp section
q2 = ModularExponentiation((a % q), dq, q);
}
return CRT(p2, p, q2, q, u);
}
...
Vì tệp là *.cpp
(đơn vị đơn vị dịch hiệu quả), chúng tôi không thực hiện #pragma GCC diagnostic push
ở đầu và #pragma GCC diagnostic pop
ở cuối. (Tuy nhiên, chúng tôi thực hiện điều đó đối với các tệp tiêu đề được bao gồm). (Chúng tôi cũng đã cố gắng làm điều đó, nhưng nó không giúp ích gì).
Và đây là GCC_DIAGNOSTIC_AWARE
(từ misc.h
):
// Used to suppress some warnings in some header and implementation files.
// Some platforms, like CentOS and OpenBSD, use old compilers that don't understand -Wno-unknown-pragma.
#define GCC_DIAGNOSTIC_AWARE ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) || defined(__clang__))
Tôi biết bảo vệ đang làm việc vì thêm một #error
trong khối gây ra một lỗi. Ngoài ra, bình luận ra bảo vệ và gọi ra #pragma GCC diagnostic ignored "-Wunknown-pragmas"
không giúp đỡ. Cuối cùng, nó hoạt động tốt dưới Clang.
Tôi cũng đang gặp phải các cảnh báo khác, như -Wunused-variable
, -Wunused-value
và -Wunused-function
. I thực sự không muốn gây ô nhiễm dòng lệnh như được đề xuất với bản sao tiềm năng.
Làm cách nào để có cơ chế GCC pragma diagnostic
hoạt động như mong đợi để cảnh báo im lặng theo GCC khi sử dụng -Wall
?
liên quan, nếu bạn muốn tái tạo nó (nó GNUmakefile dựa, và không đòi hỏi cấu hình hoặc autotools):
git clone https://github.com/weidai11/cryptopp.git cryptopp-warn
cd cryptopp-warn
make
EDIT: chúng tôi kiểm tra trong một bản vá mà vô hiệu hóa -Wall
trừ cho Clang. Nếu bạn muốn sao chép hành vi cũ, sau đó:
git clone https://github.com/weidai11/cryptopp.git cryptopp-warn
cd cryptopp-warn
export CXXFLAGS="-g2 -O3 -DNDEBUG -Wall"
make
Tôi muốn đề xuất trước tiên xóa '# if/# endif' (chỉ để lại' #pragma GCC ... ') để xem đó có phải là vấn đề với' GCC_DIAGNOSTIC_AWARE' hay không. – paxdiablo
bản sao có thể có của [Cảnh báo ngăn chặn -Wunknown-pragmas trong GCC] (http://stackoverflow.com/questions/12842306/suppress-wunknown-pragmas-warning-in-gcc) – nneonneo
@paxdiablo - Không có niềm vui. Tôi vô hiệu hóa bảo vệ, và gọi ra '#pragma GCC chẩn đoán bỏ qua "-Wunknown-pragmas" 'trực tiếp. – jww