2013-02-24 24 views
71

Tôi muốn biết bạn chuyển đổi gì sang trình biên dịch gcc để tắt cảnh báo biến không sử dụng? 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:Làm cách nào để 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?

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-value nhưng không ức chế các tin nhắn 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 đè mục tiêu của tôi?

+0

Khi thông báo lỗi nói nhiều hơn, hãy thử '-Werror = no-unused-variable' –

Trả lời

182

Việc chuyển đổi -Wno-unused-variable thường làm các trick. 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 thư mục của 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, hãy nói -isystem C:\\boost_1_52_0.

Hy vọng điều đó sẽ hữu ích. Chúc may mắn!

+40

+1 cho-hệ thống, rất hữu ích –

+0

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

+1

Wow, tôi rất vui khi biết về hệ thống. Tuyệt diệu. – Spacemoose

9

Sử dụng -Wno-unused-variable sẽ hoạt động.

+0

Ahh, giá trị không được sử dụng, không được sử dụng, không được sử dụng! – WilliamKF

+2

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

+1

Bạn thực sự có thể thấy những gì cảnh báo thực tế là '[-Werror = unused-variable]'. –

3

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

11

Xem man gcc trong Tùy chọn cảnh báo. Ở đó bạn có một bó toàn bộ unused

Cảnh báo Tùy chọn
... -Wunused -Wunused chức năng -Wunused nhãn -Wunused-tham số -Wunused giá trị -Wunused biến -Wunused-nhưng-set- tham số -Wunused-nhưng-set-biến

Nếu bạn có tiền tố bất kỳ trong số họ với 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. 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.

More giải thích chi tiết có thể được tìm thấy tại Options to Request or Suppress Warnings

+0

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

-3

Xóa -Wall và nó sẽ hoạt động. Vấn đề với việc loại bỏ -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 các tùy chọn -W trong trường hợp này hoặc đổi thành -Wno-unused-variable sau khi bạn có tất cả các cảnh báo được đề cập.

LOCAL_CFLAGS = -Wno-unused-variable -g 
+2

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

-3
export IGNORE_WARNINGS=1 

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

51

Nếu bạn đang sử dụng gcc và muốn vô hiệu hóa các cảnh báo cho mã được lựa chọn, bạn có thể sử dụng các chỉ thị 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 mà các biến cụ thể không được sử dụng.

+1

Đó là modulo một vài lỗi GCC: [Bug C++/53431: C++ preprocessor bỏ qua #pragma GCC diagnostic] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431); [Bug C++/66943: GCC cảnh báo về Pragma không xác định cho OpenMP, mặc dù nó hỗ trợ nó] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66943) và bạn bè. – jww

+0

Trong mã nguồn C, nó không hoạt động. – peterh

+0

Nói chung, tôi sẽ nói rằng việc 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 ...;) –

55

Đô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 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 thuộc tính của 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ể xảy ra tình huống khi sử dụng hàm này 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, vì vậy 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 thì trình biên dịch sẽ không thành công. Nhưng bạn không thực sự cần nó trong hàm tự hoặc ...

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

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ó! ;)

PS: Gần đây tôi đã sử dụng này để ngăn chặn cảnh báo của serialization Tăng trong mẫu như thế này:

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 như bạn cần, drak0sha thực hiện nó 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 những người khác, những người nhận được ở đây vì tiêu đề đó ... :)

+0

Tuy nhiên, đó là chính xác những gì tôi đang tìm kiếm. Thx :) –

+6

Đối với các thông số chính thức, bạn có thể bỏ qua tên, ví dụ: 'void func (số không dấu, const int)'. Sau đó, gcc cũng sẽ không phàn nàn về 'phiên bản' chưa được sử dụng. –

1

Làm cách nào để tắt cảnh báo biến không được sử dụng?
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 ...

Quý khách tham quan Boost's Trac và nộp báo cáo lỗi đối với 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ó.

Các vấn đề liên quan