Tôi có một dự án bao gồm một số tiêu đề C++ nhạy cảm với hiệu suất hoạt động hiệu quả khi sử dụng nhiều mẫu. Đối với dự án này, chúng tôi cũng bọc các tiêu đề và thêm một số mã keo để lộ chức năng cho C# và các ngôn ngữ .NET khác. Chúng tôi sẽ gọi tiêu đề này là "layout.h" và chúng tôi sẽ giả định đó là tiêu đề của bên thứ ba mà tôi không thể thay đổi.Có cách nào để phát hiện xem #pragma không được quản lý có hiệu lực trong C++/CLI không?
Trong chế độ hỗn hợp C++/CLI, việc tạo một lỗi sai và #include từ một vị trí trong mã nơi #pragma không được quản lý (hoặC#pramga được quản lý (đẩy, tắt)). Khi điều đó xảy ra, các mẫu tạo ra IL và tôi nhận được các chuyển tiếp được quản lý/không được quản lý thêm khi chạy mã và hiệu suất sẽ giảm xuống mức thoát.
Câu hỏi của tôi là liệu có cách nào tôi có thể thực hiện kiểm tra thời gian biên dịch ngay trướC#include sao cho quá trình biên dịch thất bại nếu tôi vô tình #bao gồm từ ngữ cảnh sai.
// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr
ASSERT_UNMANAGED()
#include <layout.h>
nỗ lực 1st ngây thơ của tôi đã kiểm tra #ifdef _MANAGED, nhưng đó là luôn luôn được xác định cho dù tôi đang ở trong một #pragma khối không được quản lý mã hay không.
+1: Câu hỏi thú vị. – leppie
Đây là một thực sự khó khăn. Tôi có thể nghĩ ra hàng chục cách khác nhau để triển khai 'ASSERT_MANAGED', nhưng' ASSERT_UNMANAGED' đã khiến tôi bối rối. – ildjarn
chỉ trong trường hợp ai đó tìm kiếm gì, _MANAGED, __CLR_VER và __cplusplus_cli không bị ảnh hưởng bởi #pragma managed/#pragma ummanaged, phạm vi đó là toàn bộ đơn vị biên dịch. –