2008-12-22 10 views
54

Tôi có một bó thời gian biên dịch khẳng định, chẳng hạn như:Làm cách nào để ẩn các cảnh báo "được xác định nhưng không được sử dụng" trong GCC?

CASSERT(isTrue) or CASSERT2(isTrue, prefix_) 

Khi biên dịch với GCC tôi nhận được nhiều cảnh báo như 'prefix_LineNumber' defined but not used. Có cách nào tôi có thể ẩn các cảnh báo cho các xác nhận thời gian biên dịch không? Tôi không có may mắn tìm kiếm tài liệu GCC. Tôi nghĩ rằng tôi có thể có var tự động được sử dụng trên toàn cầu bên trong cùng một vĩ mô nhưng tôi không thể nghĩ ra bất kỳ cách nào để làm điều đó.

Có ai biết cách che giấu cảnh báo đó trong GCC không?

Trả lời

2

Làm thế nào về -Wunused-label?

+3

nope nhưng câu trả lời sai của bạn dẫn tôi đến một trong những quyền: D –

42

Giải pháp cho GCC không gây xung đột với các trình biên dịch khác

#ifdef __GNUC__ 
#define VARIABLE_IS_NOT_USED __attribute__ ((unused)) 
#else 
#define VARIABLE_IS_NOT_USED 
#endif 

int VARIABLE_IS_NOT_USED your_variable; 
+1

đó là chính xác như thế nào nó cũng hoàn thành công việc trong nguồn gcc cho các đối số hàm không sử dụng. +1 :) –

+2

Tôi thấy rằng việc sử dụng ____attribute____ ((____unused____)) hoạt động cho GCC 4.x.x – mtasic85

3

Đây là khó trả lời mà không biết các chi tiết của các macro assert tĩnh của bạn. Có lẽ bạn có thể thay đổi thành một macro khác để tránh vấn đề này? Bạn có thể thêm thuộc tính 'chưa sử dụng' vào macro như đã được đề xuất hoặc bạn có thể sử dụng một dạng CASSERT() khác.

Dưới đây là giới thiệu của một vài lựa chọn:

http://www.jaggersoft.com/pubs/CVu11_3.html

http://blog.kowalczyk.info/kb/compile-time-asserts-in-c.html

http://www.pixelbeat.org/programming/gcc/static_assert.html

28

Bạn có thể tạo một tuyên bố vô đúc kết quả để làm mất hiệu lực. Đây là tính năng di động trên các trình biên dịch và gcc sẽ không cung cấp cho bạn bất kỳ cảnh báo nào, ngay cả khi bật -Wall-Wextra. Ví dụ:

int var; // var is not used 
(void)var; // null statement, cast to void -- suppresses warning 

Một kỹ thuật phổ biến là tạo một macro cho việc này:

#define UNUSED(x) ((void)(x)) 

int var; 
UNUSED(var); 
+1

Thật kỳ lạ, tôi vẫn nhận được cảnh báo. Ví dụ, khi tôi gọi hệ thống() và không quan tâm đến sự trở lại: '(void) hệ thống (cmd.c_str()); ' Tôi không hiểu tại sao điều này sẽ tạo ra một cảnh báo. – BobDoolittle

+0

@BobDoolittle: Huh, thật thú vị, tôi chưa từng thấy hành vi đó trước đây. Trình biên dịch và phiên bản nào của trình biên dịch bạn đang sử dụng? –

+0

gcc 4.8.2 trên Ubuntu 14.04. Tôi đang biên dịch tất cả các nguồn của tôi với kết quả -Wunused, và tìm kiếm một cách để ngăn chặn một cách rõ ràng cảnh báo cho những nơi mà nó đã xác minh rằng hành vi là chính xác. Tôi đã luôn luôn sử dụng một diễn viên để (void) cho rằng trong quá khứ, nhưng không làm việc ở đây. – BobDoolittle

89

Chỉ cần thấy chủ đề này trong khi tìm kiếm giải pháp cho vấn đề này. Tôi gửi ở đây cho đầy đủ các giải pháp tôi thấy ...

Cờ trình biên dịch GCC điều khiển không sử dụng warnings bao gồm:

-Wunused-function 
-Wunused-label 
-Wunused-parameter 
-Wunused-value 
-Wunused-variable 
-Wunused (=all of the above) 

Mỗi có một hình thức tiêu cực tương ứng với "không-" chèn sau khi W sẽ tắt cảnh báo (trong trường hợp nó được bật bởi -Wall, ví dụ). Do đó, trong trường hợp của bạn, bạn nên sử dụng

-Wno-unused-function 

Tất nhiên điều này làm việc cho toàn bộ mã, chứ không chỉ là xác nhận thời gian biên dịch. Đối với hành vi cụ thể theo chức năng, hãy xem Function attributes.

+0

Điều này có thể được đặt cho mỗi tệp không? – Danijel

25

Đây là một trong những cảnh báo an toàn nhất, mặc dù tôi không hiểu rằng nó có thể hữu ích (đôi khi) để kiểm tra mã chết. Nhưng tôi thường có các chức năng tĩnh để gỡ lỗi hoặc các chức năng có thể hữu ích trong tương lai hoặc chỉ được sử dụng tạm thời và tôi muốn giữ chúng trong mã.

May mắn là cảnh báo này không quan tâm đến các hàm nội dòng.

inline static foo() 
{ 
} 
+3

nội tuyến chỉ là giải pháp thay thế mà tôi cần, cảm ơn. –

+0

Làm việc như một điều quyến rũ ... UPVOTED – NSPratik

+1

Sau đó, tại sao bạn không bọc các chức năng như vậy trong các chỉ thị tiền xử lý. Ví dụ. '#ifdef UNIT_TEST static foo()'? – Mawg

4
#define UNUSED_VAR  __attribute__ ((unused)) 

cho bất kỳ biến chỉ cần sử dụng vĩ mô trên trước khi loại của nó ví dụ:

UNUSED_VAR int a = 2; 
+1

Chúng tôi đã áp dụng điều này cho dự án. NHƯNG, chỉ cho các trường hợp trình biên dịch bị nhầm lẫn trong các cảnh báo của nó. Ví dụ, chúng tôi có một số biến mà chỉ được truy cập bởi con trỏ, do đó trình biên dịch tin rằng chúng không được sử dụng. Có thể chấp nhận các cảnh báo cho các biến đó, nhưng các biến không được sử dụng thực sự phải được loại bỏ khỏi mã của chúng ta. – Mawg