Câu hỏi Làm thế nào để bạn vô hiệu hóa các cảnh báo biến không được sử dụng sắp ra khỏi gcc trong mã của bên thứ 3 mà tôi không muốn chỉnh sửa?


Tôi muốn biết những gì bạn chuyển sang chuyển sang trình biên dịch gcc để tắt cảnh báo biến không sử dụng? Tôi đang nhận được lỗi ra khỏi tăng trên cửa sổ 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 đã thử sử dụng cả hai -Wunused-value và -Wno-unused-value nhưng không nén các thông điệp trên.

Lệnh đúng 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ẽ -Wall ghi đè mục tiêu của tôi?


75
2018-02-24 16:24


gốc


Khi thông báo lỗi nhiều hay ít nói, hãy thử -Werror=no-unused-variable - Joachim Isaksson
Có thể trùng lặp Làm thế nào để tôi im lặng một cảnh báo tốt nhất về các biến không sử dụng? - Jim Fell


Các câu trả lời:


Các -Wno-unused-variable chuyển đổi thường là lừa. Tuy nhiên, đó là một cảnh báo rất hữu ích thực sự nếu bạn quan tâm đến những điều này trong dự án của bạn. Nó trở nên 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 giữ cảnh báo nhưng sử dụng -isystem thay vì -I để bao gồm các thư mục của các dự án của bên thứ ba. Lá cờ đó nói với GCC đừng cảnh báo bạn về những thứ bạn không kiểm soát được.

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

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


195
2018-02-24 16:31



+1 cho hệ thống, rất hữu ích - Sam Miller
Nơi để thêm cài đặt này? Đã làm nó dưới "Cài đặt dự án / AVR GNU C Compiler / Miscellaneous" nhưng nó sẽ bị bỏ qua (đường dẫn là chính xác, vẫn nhận được cảnh báo) Khi thêm vào hộp kiểm cài đặt thư mục (bỏ chọn đường dẫn tương đối) AtmelStudio sẽ sụp đổ. - hfrmobile
Wow, tôi rất vui khi tìm hiểu về isystem. Tuyệt diệu. - Spacemoose


Đôi khi bạn chỉ cần ngă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ỉ để được an toàn. Trong mã của bạn, bạn có thể ngăn chặn các cảnh báo cho các biến và thậm chí các tham số chính thức bằng cách sử dụng GCC không sử dụng thuộc tính. 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 chức năng này như một trình xử lý - trong đó (imho) là khá phổ biến trong thư viện C ++ Boost. Sau đó, bạn cần tham số chính thức thứ hai phiên bản, do đó, chữ ký của hàm cũng giống như khuôn mẫu mà trình xử lý yêu cầu, nếu không thì trình biên dịch sẽ thất bại. Nhưng bạn không thực sự cần nó trong chính chức năng đó ...

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 trang người đàn ông. Điều này cũng làm việc cho 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ỉ xử lý. Đi trước và thử nó! ;)

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

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

EDIT: 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 tốt hơn. Đó là bởi vì tôi chủ yếu 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 người khác, những người nhận được ở đây vì tiêu đề đó ... :)


59
2018-04-28 02:22



Tuy nhiên, đó là chính xác những gì tôi đang tìm kiếm. Cám ơn :) - Plankalkül
Đối với các thông số chính thức, bạn có thể bỏ qua 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


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 lệnh #pragma compiler:

#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.


56
2018-03-28 09:17



Đó là modulo một vài lỗi GCC: Lỗi C ++ / 53431: Trình tiền xử lý C ++ bỏ qua chẩn đoán #pragma GCC; Lỗi C ++ / 66943: GCC cảnh báo về Pragma không xác định cho OpenMP, mặc dù nó hỗ trợ nó, và những người bạn. - jww
Trong mã nguồn C nó không hoạt động. - peterh
Nói chung, tôi sẽ nói rằng sử dụng chỉ thị #pragma không an toàn lắm, trừ khi bạn thực sự biết bạn đang làm gì hoặc bạn đang sử dụng ví dụ: OpenMP để song song ...;) - Dee'Kej


Xem man gcc trong Tùy chọn cảnh báo. Ở đó bạn có cả đống unused 

Tùy chọn cảnh báo
  ... -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-nhưng-set-parameter -Wunused-nhưng-set-biến

Nếu bạn thêm tiền tố vào bất kỳ no-, nó sẽ vô hiệu hóa 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ân vân. Hầu hết trong số này có cả hình thức tích cực và tiêu cực; hình thức tiêu cực của -ffoo sẽ là -fno-foo. Tài liệu hướng dẫn này chỉ ghi một trong hai hình thức này, bất kỳ hình thức nào không phải là 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 chặn cảnh báo


13
2018-02-24 16:30



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


Sử dụng -Wno-unused-variable nên làm việc.


9
2018-02-24 16:26



Ahh, không sử dụng biến, không sử dụng giá trị! - WilliamKF
Hoặc là -Wno-error=unused-variable nếu bạn muốn xóa lỗi và giữ cảnh báo. - Oskar N.
Bạn thực sự có thể thấy cảnh báo thực tế là gì [-Werror=unused-variable]. - Mats Petersson


Trình biên dịch đã cho bạn biết, nó không phải value nhưng variable. Bạn đang tìm kiếm -Wno-unused-variable. Cũng cố gắng g++ --help=warnings để xem danh sách các tùy chọn có sẵn.


3
2018-02-24 16:28





Làm thế nào để bạn vô hiệu hóa các cảnh báo biến không được sử dụng sắp ra khỏi gcc?
  Tôi nhận được lỗi ra khỏi tăng trên cửa sổ và tôi không muốn chạm vào mã tăng ...

Bạn đến thăm Trac của Boost 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 trong thư viện. Thư viện có trách nhiệm thanh toán bù trừ cảnh báo và lỗi của chính nó.


1
2017-07-26 19:52





Gỡ bỏ -Wall và nó sẽ hoạt động. Sự cố khi xóa -Wall là nó cũng sẽ ngăn chặn các cảnh báo hợp pháp. Bạn sẽ phải chọn -W tùy chọn trong trường hợp này hoặc thay đổi thành -Wno-unused-variable một khi bạn có tất cả các cảnh báo được bảo hiểm.

LOCAL_CFLAGS = -Wno-unused-variable -g

-3
2018-05-28 22:13



Thông tin này đã tồn tại trong các câu trả lời trước. - GManNickG


export IGNORE_WARNINGS=1

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


-3
2017-10-14 09:53