2011-08-23 40 views
66

Có cách nào để vô hiệu hóa chỉ một dòng cảnh báo duy nhất trong tệp cpp với studio trực quan không?Vô hiệu hóa một lỗi cảnh báo duy nhất

Ví dụ, nếu tôi bắt ngoại lệ và không xử lý, tôi gặp lỗi 4101 (biến cục bộ không được tham chiếu). Có một cách để bỏ qua điều này chỉ trong chức năng đó, nhưng nếu không báo cáo nó trong đơn vị biên dịch? Hiện tại, tôi đặt #pragma warning (disable : 4101) ở đầu tệp, nhưng điều đó rõ ràng là tắt nó đi cho toàn bộ đơn vị.

+14

nếu bạn chỉ đề cập đến loại và không đặt tên ngoại lệ, sẽ không có cảnh báo. Ví dụ. 'catch (const std :: exception &/* unnamed * /) {....}'. Nó không trả lời câu hỏi của bạn, nhưng có thể giải quyết vấn đề của bạn. – Sjoerd

Trả lời

112
#pragma warning(push) 
#pragma warning(disable : 4101) 
// Your function 
#pragma warning(pop) 
+1

Tôi cho rằng tác phẩm này cũng bao gồm? – Cookie

+0

@Cookie: có, nó hoạt động đối với bất kỳ đoạn mã nào đi qua trình biên dịch. –

+0

Để biết câu trả lời gần đây, ngắn gọn hơn, hãy xem câu trả lời của Daniel Seither bên dưới. –

4

Thay vì đặt nó lên trên cùng của tệp (hoặc thậm chí tệp tiêu đề), chỉ cần quấn mã được đề cập với #pragma warning (push), #pragma warning (disable) và phù hợp với #pragma warning (pop), như được hiển thị here.

Mặc dù có một số tùy chọn khác, bao gồm #pramga warning (once).

9

Sử dụng #pragma warning (push), sau đó #pragma warning (disable), sau đó đặt mã của bạn, sau đó sử dụng #pragma warning (pop) như mô tả here:

#pragma warning(push) 
#pragma warning(disable : WarningCode) 
// code with warning 
#pragma warning(pop) 
22

#pragma push/pop thường là một giải pháp cho loại vấn đề, nhưng trong trường hợp này tại sao bạn không loại bỏ biến không được trả lời?

try 
{ 
    // ... 
} 
catch(const your_exception_type &) // type specified but no variable declared 
{ 
    // ... 
} 
+4

Đây không phải là vấn đề. Cấp, điều này có thể giải quyết vấn đề của OP, nhưng sẽ không giúp người đọc trong tương lai với một câu hỏi mô phỏng: "làm thế nào để tắt một cảnh báo cụ thể cho một phần cụ thể của mã của tôi?" – Sjoerd

+0

@Sjoerd: ba người đã trả lời" câu hỏi chính thức "mà người khác có thể tìm kiếm, vì vậy thay vào đó tôi cố gắng đọc giữa các dòng và giải quyết vấn đề thực tế của anh ấy (đến một phút sau bình luận của bạn': P') –

+6

@Sjoerd –

1

Nếu bạn muốn vô hiệu hóa unreferenced local variable ghi trong một số tiêu đề

template<class T> 
void ignore (const T &) {} 

và sử dụng

catch(const Except & excpt) { 
    ignore(excpt); // No warning 
    // ... 
} 
+2

Một cuộc gọi chức năng, chỉ để ngăn chặn các cảnh báo? Tại sao bạn không làm thay vào đó: '(void) unusedVar;'? – Nawaz

+0

@Nawaz: Tôi nghĩ rằng '(void) unusedVar;?' không phải là C++ Standard conformant –

+0

Ai nói? Bất kỳ tham chiếu nào? – Nawaz

4

Người ta cũng có thể sử dụng quy định tại UNREFERENCED_PARAMETERWinNT.H. Định nghĩa chỉ là:

#define UNREFERENCED_PARAMETER(P)   (P) 

Và sử dụng nó như:

void OnMessage(WPARAM wParam, LPARAM lParam) 
{ 
    UNREFERENCED_PARAMETER(wParam); 
    UNREFERENCED_PARAMETER(lParam); 
} 

Tại sao bạn sẽ sử dụng nó, bạn có thể tranh luận rằng bạn chỉ có thể bỏ qua tên biến chính nó. Vâng, có những trường hợp (cấu hình dự án khác nhau, các phiên bản gỡ lỗi/phát hành), nơi biến thực sự có thể được sử dụng. Trong một cấu hình khác mà biến không được sử dụng (và do đó cảnh báo).

Một số phân tích mã tĩnh vẫn có thể đưa ra cảnh báo cho tuyên bố không vô nghĩa này (wParam;). Trong trường hợp đó, bạn có thể sử dụng DBG_UNREFERENCED_PARAMETER tương tự như UNREFERENCED_PARAMETER trong quá trình gỡ lỗi và thực hiện P=P trong bản dựng.

#define DBG_UNREFERENCED_PARAMETER(P)  (P) = (P) 
2

Trong những tình huống nhất định bạn phải có một tham số có tên nhưng bạn không sử dụng nó trực tiếp.
Ví dụ, tôi chạy vào nó trên VS2010, khi 'e' chỉ được sử dụng bên trong câu lệnh decltype, trình biên dịch than phiền nhưng bạn phải có tên biến là e.

Tất cả ở trên không #pragma gợi ý tất cả đun sôi xuống chỉ còn thêm một tuyên bố duy nhất:

bool f(int e) 
{ 
    // code not using e 
    return true; 
    e; // use without doing anything 
} 
+0

bây giờ (trong trình biên dịch MS VS2015) điều này gây ra mã C4702 không thể truy cập – dlatikay

43

Nếu bạn chỉ muốn ngăn chặn một cảnh báo trong một dòng mã, bạn có thể sử dụng suppresswarning specifier:

#pragma warning(suppress: 4101) 
// here goes your single line of code where the warning occurs 

Đối với một dòng mã, công trình này giống như cách viết như sau:

#pragma warning(push) 
#pragma warning(disable: 4101) 
// here goes your code where the warning occurs 
#pragma warning(pop) 
+6

Rất hữu ích! Thật không may, nó không hoạt động cho một dòng đơn bao gồm tiêu đề tạo cảnh báo. –

+1

@MarkoPopovic: Trình chỉ định 'suppress' hoạt động trên một dòng ** mã đã được xử lý trước **. Nếu dòng bên dưới '#pragma warning (suppress: ...)' là một chỉ thị '# include' (mở rộng tệp tham chiếu bởi tham số của nó vào đơn vị biên dịch hiện tại), hiệu ứng chỉ áp dụng cho dòng đầu tiên của tệp đó . Điều này nên được rõ ràng, vì cảnh báo được tạo ra bởi trình biên dịch. Trình biên dịch hoạt động trên mã được xử lý trước. – IInspectable

1

Ví dụ:

#pragma warning(suppress:0000) // (suppress one error in the next line) 

pragma này có giá trị C++ bắt đầu với Visual Studio 2005.
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx

Các pragma là không hợp lệ cho C# qua Visual Studio 2005 thông qua Visual Studio 2015
Lỗi: "Đã tắt hoặc khôi phục dự kiến".
(tôi đoán họ không bao giờ có xung quanh để thực hiện suppress ...)
https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx

C# cần một định dạng khác nhau. Nó sẽ giống như thế này (nhưng không làm việc):

#pragma warning suppress 0642 // (suppress one error in the next line) 

Thay vì suppress, bạn phải disableenable:

if (condition) 
#pragma warning disable 0642 
    ; // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642) 
#pragma warning restore 0642 
else 

Đó là SO xấu xí, tôi nghĩ rằng đó là thông minh hơn để chỉ tái phong cách:

if (condition) 
{ 
    // Do nothing (because blah blah blah). 
} 
else 
Các vấn đề liên quan