Làm cách nào để tắt các cảnh báo biến không sử dụng đến từ gcc trong mã của bên thứ ba mà tôi không muốn chỉnh sửa?


93

Tôi muốn biết bạn chuyển công tắc nào sang trình biên dịch gcc để tắt cảnh báo biến không sử dụng? Tôi đang gặp lỗi khi tăng tốc trên windows và tôi không muốn chạm vào mã tăng:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

Tôi đã cố gắng sử dụng cả hai -Wunused-value-Wno-unused-valuenhưng không ức chế các tin nhắn trên.

Lệnh phù hợp là gì, đây là dòng biên dịch của tôi:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

Có lẽ -Wallmục tiêu của tôi ghi đè lên?


Như thông báo lỗi nhiều hay ít nói, cố gắng-Werror=no-unused-variable
Joachim Isaksson

Câu trả lời:


236

Công -Wno-unused-variabletắc thường thực hiện thủ thuật. Tuy nhiên, đó thực sự là một cảnh báo rất hữu ích nếu bạn quan tâm đến những điều này trong dự án của mình. Tuy nhiên, thật khó chịu khi GCC bắt đầu cảnh báo bạn về những thứ không có trong mã của bạn.

Tôi khuyên bạn nên bật cảnh báo, nhưng sử dụng -isystemthay vì sử dụng -Iđể bao gồm các thư mục của các dự án bên thứ ba. Cờ đó yêu cầu GCC không cảnh báo bạn về những thứ bạn không có quyền kiểm soát.

Ví dụ, thay vì -IC:\\boost_1_52_0nói -isystem C:\\boost_1_52_0.

Hy vọng nó giúp. Chúc may mắn!


Thêm cài đặt này ở đâu? Đã thực hiện nó trong "Cài đặt dự án / AVR GNU C Compiler / Linh tinh" nhưng nó sẽ bị bỏ qua (đường dẫn đúng, vẫn nhận được cảnh báo) Khi thêm nó vào cài đặt Thư mục (bỏ chọn hộp kiểm đường dẫn tương đối) AtmelStudio sẽ bị lỗi.
hfrmobile

3
chúng tôi cũng có -Wno-unused-parametercác tham số chức năng không sử dụng -Wno-unused-function cho chức năng không sử dụng
Ngô Thanh Nhàn

1
Bạn cần:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer

82

Đôi khi bạn chỉ cần chặn một số cảnh báo và bạn muốn giữ các cảnh báo khác, chỉ để an toàn. Trong mã của mình, bạn có thể loại bỏ các cảnh báo cho các biến và thậm chí cả các tham số chính thức bằng cách sử dụng thuộc tính không sử dụng của GCC . Giả sử bạn có đoạn mã này:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

Có thể có một tình huống, khi bạn cần sử dụng hàm này như một trình xử lý - hàm này (imho) khá phổ biến trong thư viện C ++ Boost. Sau đó, bạn cần phiên bản tham số chính thức thứ hai , do đó, chữ ký của hàm giống với mẫu mà trình xử lý yêu cầu, nếu không quá trình biên dịch sẽ thất bại. Nhưng bạn cũng không thực sự cần nó trong chính hàm ...

Giải pháp làm thế nào để đánh dấu biến hoặc tham số chính thức được loại trừ khỏi cảnh báo là:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

GCC có nhiều thông số khác, bạn có thể kiểm tra chúng trong các trang người đàn ông . Điều này cũng hoạt động đối với các chương trình C, không chỉ C ++ và tôi nghĩ rằng nó có thể được sử dụng trong hầu hết các chức năng, không chỉ trình xử lý. Đi trước và thử nó! ;)

Tái bút: Gần đây, tôi đã sử dụng cái này để ngăn chặn các cảnh báo về việc tuần tự hóa của Boosts trong mẫu như thế này:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

CHỈNH SỬA: Rõ ràng, tôi đã không trả lời câu hỏi của bạn khi bạn cần, drak0sha đã làm điều đó tốt hơn. Đó là bởi vì tôi chủ yếu làm theo tiêu đề của câu hỏi, xấu của tôi. Hy vọng rằng, điều này có thể giúp ích cho những người khác, những người đến đây vì danh hiệu đó ... :)


7
Đối với các thông số chính thức, bạn có thể bỏ qua cái tên, ví dụ void func(unsigned number, const int). Sau đó, gcc cũng sẽ không phàn nàn về việc không sử dụng version.
Olaf Dietsche

@OlafDietsche Tôi nghĩ điều này phụ thuộc vào gccphiên bản bạn đang sử dụng. IIRC, tôi đã phải sử dụng nó 4 năm trước, để ngăn chặn các cảnh báo về việc không sử dụng version. ;)
Dee'Kej

66

Nếu bạn đang sử dụng gcc và muốn tắt cảnh báo cho mã đã chọn, bạn có thể sử dụng chỉ thị trình biên dịch #pragma:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

Đối với mã bạn kiểm soát, bạn cũng có thể sử dụng __attribute__((unused))để hướng dẫn trình biên dịch rằng các biến cụ thể không được sử dụng.



Nói chung, tôi sẽ nói sử dụng chỉ thị # pragma không phải là rất an toàn, trừ khi bạn thực sự biết những gì bạn đang làm, hoặc bạn đang sử dụng ví dụ như các OpenMP cho song song ...;)
Dee'Kej

1
Các #pragmachỉ thị @ Dee'Kej hoàn toàn an toàn nếu bạn quấn chúng vào #ifdef some_compiler ... #endif. Cảnh báo là một tính năng dành riêng cho trình biên dịch và không được xác định theo tiêu chuẩn. Bạn không thể chặn bất kỳ cảnh báo nào từ mã mà không có #pragmas.
Kotauskas

@ vladislav-toncharov Bạn nói đúng về các cảnh báo dành riêng cho trình biên dịch. Nhưng chúng ta không nói chung về cảnh báo trình biên dịch ở đây - chúng ta đang nói riêng về GCC. Bạn cũng đúng về việc #pragma không có hại cho mỗi lần nói. Tuy nhiên, IMO nhiều người không biết cách sử dụng đúng #pragma, và đó là lý do tại sao tôi coi nó là "nguy hiểm" (vì thiếu các từ tốt hơn).
Dee'Kej

15

Xem man gcctrong Tùy chọn cảnh báo. Ở đó bạn có một loạtunused

Tùy chọn cảnh báo
... -Không sử dụng-không sử dụng-chức năng-không sử dụng-nhãn-sử dụng-tham số-không sử dụng-giá trị-không sử dụng-biến-không sử dụng-nhưng-đặt-tham số-không sử dụng-nhưng-đặt-biến

Nếu bạn đặt tiền tố bất kỳ trong số chúng bằng no-, nó sẽ tắt cảnh báo này.

Nhiều tùy chọn có tên dài bắt đầu bằng -f hoặc với -W --- ví dụ, -fmove-loop-invariants, -Wformat, v.v. Hầu hết trong số này có cả hai dạng tích cực và tiêu cực; dạng phủ định của -ffoo sẽ là -fno-foo. Tài liệu hướng dẫn này chỉ cung cấp một trong hai biểu mẫu này, biểu mẫu nào không phải là biểu mẫu mặc định.

Giải thích chi tiết hơn có thể được tìm thấy tại Tùy chọn để yêu cầu hoặc cảnh báo đàn áp


Không biết rằng tôi có thể đặt tiền tố "no-" với bất kỳ cảnh báo nào.
RNA

10

Sử dụng -Wno-unused-variablesẽ hiệu quả.


Ahh, biến không sử dụng, không phải giá trị không sử dụng!
WilliamKF

5
Hoặc -Wno-error=unused-variablenếu bạn muốn xóa lỗi và giữ lại cảnh báo.
Oskar N.

1
Bạn thực sự có thể thấy cảnh báo thực sự là gì [-Werror=unused-variable].
Mats Petersson

3

Trình biên dịch đã nói với bạn, nó không phải valuenhưng variable. Bạn đang tìm kiếm -Wno-unused-variable. Ngoài ra, hãy thử g++ --help=warningsxem danh sách các tùy chọn có sẵn.


3

Làm cách nào để bạn tắt các cảnh báo biến không sử dụng đến từ gcc?
Tôi đang gặp lỗi khi tăng tốc trên windows và tôi không muốn chạm vào mã tăng ...

Bạn ghé thăm Boost's Trac và gửi báo cáo lỗi về Boost.

Ứng dụng của bạn không chịu trách nhiệm xóa các cảnh báo và lỗi của thư viện. Thư viện có trách nhiệm xóa các cảnh báo và lỗi của riêng mình.


0

-Wall-Wextrathiết lập giai đoạn trong GCC và việc tiếp theo -Wno-unused-variablecó thể không có hiệu lực. Ví dụ: nếu bạn có:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

thì GCC nhìn thấy hướng dẫn -Wall -Wextravà dường như bỏ qua-Wno-unused-variable

Thay vào đó, điều này có thể trông giống như bên dưới và bạn sẽ có được hiệu quả mong muốn là không bị dừng biên dịch của mình trên biến không sử dụng:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

Có một lý do chính đáng mà nó được gọi là "cảnh báo" so với "lỗi". Việc biên dịch không thành công chỉ vì bạn viết mã không hoàn chỉnh (giả sử bạn đang khai thác thuật toán) có thể là thất bại.


-3
export IGNORE_WARNINGS=1

Nó hiển thị cảnh báo, nhưng vẫn tiếp tục với bản dựng

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.