2009-02-16 36 views
18

Tôi muốn vô hiệu hóa ngoại lệ trong ứng dụng C++ của tôi, được biên dịch theo MSVC. Tôi đã chuyển sang tùy chọn Enable C++ exceptions thành NO, nhưng tôi nhận được cảnh báo cho tôi biết sử dụng tùy chọn/Ehsc, cái mà tôi không muốn.Tôi có thể tắt ngoại lệ trong STL không?


Tôi không có khối try/catch trong mã của mình, nhưng tôi sử dụng STL. Tôi đã tìm thấy rằng việc sử dụng _HAS_EXCEPTIONS định nghĩa macro = 0 nên vô hiệu hóa các trường hợp ngoại lệ trong STL, nhưng tôi vẫn nhận được cảnh báo như:


warning C4275: non dll-interface class 'stdext::exception' used as base for dll-interface class 'std::bad_typeid' see declaration of 'stdext::exception' see declaration of 'std::bad_typeid'


Có cách nào làm thế nào để tắt các ngoại lệ STL là gì?

Lưu ý: Trong mã của tôi, tôi cũng muốn tắt các tùy chọn RTTI. Tôi nhận được cảnh báo tương tự cho dù RTTI có bật hay tắt.

Trả lời

5

Id loại là để thực hiện với xác định loại thời gian chạy. Bạn cũng có thể thử tắt RTTI.

Tuy nhiên, một số phần nhất định của Thư viện chuẩn C++ được chỉ định để loại trừ ngoại lệ. Nếu bạn vô hiệu hóa chúng, bạn đang chèo thuyền vào vùng biển u ám của "hành vi không xác định".

7

Bạn cần sử dụng STL hỗ trợ hủy kích hoạt ngoại lệ. Đây thường là định nghĩa macro biên dịch.

Trừ khi tôi nhầm, STLPort cung cấp điều này với _STLP_USE_EXCEPTIONS = 0 và _STLP_NO_EXCEPTIONS. Tôi không biết các chương trình hoạt động như thế nào với các cài đặt này. ;)

Tôi nghĩ có một số cờ ẩn trong MS STL.

Các EASTL đi ra khỏi hộp với trường hợp ngoại lệ bị vô hiệu hóa:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html

10

Microsoft STL hỗ trợ Chấm dứt hoạt ngoại lệ.

Đối với macro xác định MSVC STL _HAS_EXCEPTIONS = 0 vô hiệu hóa ngoại lệ trong trường hợp bạn liên kết ứng dụng của mình với tùy chọn trình biên dịch libcmt.lib/libcmtd.lib (/ MT hoặc/MTd).

Nếu bạn liên kết với msvcrt.lib/msvcrtd.lib (/ MD hoặc/MDd tùy chọn trình biên dịch), bạn cần xác định thêm một macro - _STATIC_CPPLIB. Trong trường hợp này hoặc thêm những dòng sau đây trước khi đưa bất kỳ mã STL:

#define _HAS_EXCEPTIONS 0 
#define _STATIC_CPPLIB 

hoặc thêm dòng sau vào tùy chọn biên dịch:

-D_HAS_EXCEPTIONS=0 -D_STATIC_CPPLIB 

Xin lưu ý rằng bạn cần phải vô hiệu hóa ngoại lệ C++ trong môi trường dự án của bạn.

+0

Điều tôi không hiểu là khi sử dụng/MD hoặc/MDd tại sao chúng ta cần _STATIC_CPPLIB. Từ những gì tôi đã có thể đọc nó gây ra mã để sử dụng libcmt.lib và không msvcrtd.lib. Toàn bộ điểm sử dụng/MD là có các thư viện được liên kết động và không phải các thư viện liên kết tĩnh. Thêm _STATIC_CPPLIB dường như đánh bại mục đích sử dụng cờ/MD. – gnash117

+0

_STATIC_CPPLIB không được chấp nhận trong MSVC 2010 để sử dụng MSVC 2010 sẽ chỉ thay thế một bộ cảnh báo này bằng một cảnh báo khác. – gnash117

+0

gnash117, MSDN cho MSVC2008 cho biết khi sử dụng định nghĩa tiền xử lý _STATIC_CPPLIB, ứng dụng của bạn liên kết libcmt.lib thay vì msvcprt.lib, nhưng vẫn liên kết động với CRT chính qua msvcrt.lib. – Rom098

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