2010-07-17 39 views
13

Tôi có thư viện của bên thứ ba tạo ra hàng tấn cảnh báo, ngay cả trong/W3. Có cách nào để tôi nói với trình biên dịch, "vô hiệu hóa C4244 cho bất kỳ tập tin bao gồm từ thư mục này, hoặc thư mục con của nó"? Tất nhiên, tôi không muốn vô hiệu hóa cảnh báo trong codebase của riêng mình, cũng như tôi không phải theo dõi từng trường hợp có thể bao gồm và quấn nó với #pragma warning(...Bạn có thể tắt cảnh báo trình biên dịch (cụ thể) cho bất kỳ tiêu đề nào được đưa vào từ một vị trí cụ thể không?

+1

Câu hỏi hay :) Tôi rất vui nếu tôi có thể tắt cảnh báo từ tiêu đề Qt. –

+0

@Vitor: Tôi chắc rằng tôi KHÔNG biết bạn đang nói về cái gì. ;) – moswald

+0

Tôi không chắc liệu trình biên dịch có thể thực hiện được hay không. Nhưng thực tế, bạn có thể lọc các cảnh báo này sau khi biên dịch. – czchen

Trả lời

9

Tôi ghét phải trả lời câu hỏi của riêng tôi ở đây, nhưng tôi sợ rằng câu trả lời "đúng" trong trường hợp này là: nó không thể.

+1

Có. Tôi thậm chí đã cố gắng lạm dụng bộ xử lý trước để tạo ra một macro INCLUDE đã tắt cảnh báo nhưng điều đó dường như không thể. Cách duy nhất ra để có một số đầu ra hợp lý tôi nghĩ là grep đầu ra cảnh báo trình biên dịch nhưng bây giờ tôi chỉ sống với tất cả các cảnh báo. –

+0

Trong Visual Studio 2015 (ít nhất) có một dự án 'Thuộc tính/Tất cả Tùy chọn/Tắt cảnh báo cụ thể' bạn có thể đặt. CLI cho điều đó là '/ wd4244'. Trong các trình biên dịch khác, nó có thể là '/ nowarn: 4244'. –

3

Tôi không chắc chắn bạn có ý là bạn không muốn để bao gồm các câu lệnh bao gồm của bạn với chỉ thị #pragma hoặc không muốn dành thời gian theo dõi đúng chỉ thị. Nếu sau này, thì đây là những gì tôi đã làm trong quá khứ:

#ifdef _MSC_VER 
#pragma warning(disable : 4244) 
#endif 

#include "MyHeader.h" 

#ifdef _MSC_VER 
#pragma warning(default : 4244) /* Reset to default state */ 
#endif 
+0

Xin lỗi, đó là trước đây. Tôi biết cách vô hiệu hóa cảnh báo thông qua #pragma rồi. – moswald

+0

Điều này sẽ hoạt động. Trình biên dịch ghi nhớ pragma cảnh báo đã có hiệu lực khi nó biên dịch tờ khai. –

+1

@Hans: Điều này có thể tắt các cảnh báo được tạo bởi MyHeader.h, nhưng nó không trả lời câu hỏi của tôi. Tôi không muốn tìm kiếm một vài trăm tập tin cho vài chục thư viện bao gồm, và sau đó bọc chúng với #pragmas. – moswald

3

Bạn có thể thử xóa dự án của bên thứ ba khỏi đường dẫn bao gồm của bạn. Sau đó, tạo một thư mục con có cùng cấu trúc thư mục và tệp tiêu đề làm dự án của bên thứ 3, để tất cả #includes giờ đây tìm thấy tiêu đề của bạn thay thế. Sau đó, trong mỗi tiêu đề giả xxxx.h bạn đặt pragma sau đó bao gồm tiêu đề xxxx.h thực, sau đó xóa pragma. Để tránh đệ quy bao gồm cùng một tệp, bạn sẽ phải thêm một thư mục phụ vào #include.

Cá nhân, tôi vừa xem qua dự án của bạn và thêm pragma.

5

Bạn có thể đặt cờ ví dụ /wd4600 trong VS Project Settings > Command-line Options nói với trình biên dịch để ngăn chặn cụ thể Complier Warnings

+8

Điều này bỏ lỡ phần mà anh ta nói, "Tôi không muốn vô hiệu hóa cảnh báo trong codebase của chúng ta." –

0

Hãy thử:

//in wrapper_3rdParty.h 
#pragma once 

#pragma warning(push) 
#pragma warning(disable : 4244) 

#include "3rdParty.h" 

#pragma warning(pop) 

Sau đó, trong mã của bạn, chỉ cần #include "wrapper_3rdParty.h" để thay thế.

Điều đó xử lý các sự cố với hành vi default về cảnh báo và tất cả sự xúi giục của việc bạn sử dụng gói htat đều có cảnh báo bị chặn.

+0

Để trả lời tất cả các nhận xét của bạn ở cùng một nơi: thư viện lớn và tôi phải viết hàng tá thư này. Tôi đã hỏi về một lối tắt. – moswald

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