2012-03-12 32 views
8

Đoạn mã sau KHÔNG chặn bất kỳ cảnh báo trình biên dịch C4503 nào, nhưng nó ngăn chặn cảnh báo C4244.Có thể tắt cảnh báo trình biên dịch C4503 không?

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

#include <map> 
#include <string> 

int main(int argc, char *argv[]) 
{ 
    class Field; 
    typedef std::map<std::string, Field * > Screen; 
    typedef std::map<std::string, Screen> WebApp; 
    typedef std::map<std::string, WebApp> WebAppTest; 
    typedef std::map<std::string, WebAppTest> Hello; 
    Hello MyWAT; // The C4503 error is NOT suppressed 

    int a; 
    a = 5.0f; // The C4244 error is suppressed 
} 

#pragma warning(pop) 

Vui lòng giải thích lý do tại sao cảnh báo C4503 không bị chặn. Lưu ý: có thể do một lý do tương tự như được tham chiếu trong How can I work around warning C4505 in third party libraries?.

Xem thisthis để biết thêm thông tin có liên quan.

Tôi đang sử dụng Visual Studio 2008 trên máy tính Windows 7.

+2

Nếu không có một số ngữ cảnh bổ sung, nơi bạn đang tắt cảnh báo, sẽ hơi khó để đưa ra giải pháp. Đoán của tôi: Bạn vô hiệu hóa cảnh báo xung quanh mã mà instantiates mẫu quái vật, nhưng bạn cần phải vô hiệu hóa trước khi tiêu đề, nơi các mẫu được định nghĩa được bao gồm. – Xeo

+0

@Xeo Tôi đã kiểm tra kỹ và xác nhận rằng đây không phải là vấn đề. –

+0

Bạn nên suy nghĩ về việc giải quyết các cảnh báo này, vì sau này chúng có thể dẫn đến các sự cố, ví dụ: khi liên kết. – PlasmaHH

Trả lời

3

Không rõ ràng từ ngữ cảnh, nhưng có thể bạn có quá nhiều câu hỏi #pragma? MSDN nói:

The compiler only supports up to 56 #pragma warning statements in a compiland. 
+0

Tôi đã kiểm tra và xác nhận rằng đây không phải là vấn đề. –

+2

Sau đó, tôi khuyên bạn nên cung cấp một ví dụ tối thiểu. Nếu không, chúng tôi không có cơ hội nhưng đoán, và điều này không phải là rất thỏa mãn. – Matthias

+1

Câu hỏi của tôi đã được chỉnh sửa để cung cấp một ví dụ có thể chạy được về vấn đề này. –

2

Bit lạ nhưng bạn có thể tắt cảnh báo này bằng mã chính xác bằng cách xóa #pragma warning(pop). Tôi không hiểu tại sao.

Tôi nên nói tôi đang ở phiên bản VS2010 C++ Express.

+0

sử dụng nó ở đâu? – PlasmaHH

+1

Tôi đã tạo một ứng dụng bảng điều khiển CLR mới, thay thế nội dung của projectname.cpp bằng mã trên, thêm '#include" stdafx.h "' và được biên dịch, và nó cho tôi vô số cảnh báo. Sau đó, tôi nhận xét cảnh báo '#pragma '(pop) cuối cùng và không có cảnh báo. – demoncodemonkey

+0

Tôi có thể tưởng tượng rằng giai đoạn tạo ra những cảnh báo này sau đó, sau tất cả các loại instantiations và ngữ nghĩa, nơi pop đã được kích hoạt. – PlasmaHH

1

Có thể nói rõ ràng nhưng bạn có thể sử dụng cài đặt IDE để loại bỏ hoàn toàn (và các) cảnh báo khác, như được giải thích here.

Đó là giải pháp duy nhất có hiệu quả đối với tôi và được chứng minh sau khi biết rằng Boost có các chính sách bật/tắt cảnh báo được tích hợp bên trong, thay đổi hành vi của lệnh #pragma push/pop/enable/disable.

+0

Điều này cũng hoạt động để vô hiệu hóa văn bản cảnh báo trong cửa sổ đầu ra. –

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