2011-08-12 26 views
9

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.

+0

+1: Câu hỏi thú vị. – leppie

+0

Đâ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

+0

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. –

Trả lời

1

Bạn có thể viết ASSERT_MANAGED hoặc ASSERT_UNMANAGED mã sẽ sử dụng cấu trúc CHỈ có sẵn trong khi biên dịch được quản lý hoặc không được quản lý. Tuyên bố ref class là ví dụ chỉ khả dụng khi được quản lý.

Đây là một phần giải pháp bẩn, nhưng nó sẽ hoạt động.

+1

Vì vậy, khai báo lớp ref-làm việc khi viết ASSERT_MANAGED(). Bí quyết là tìm C++ hợp pháp không hợp pháp C++/CLI để cho phép viết khối ASSERT_UNMANAGED() –

+2

Một đối thủ cạnh tranh gần nhất đang sử dụng nối chuỗi không đổi, nếu nó hoạt động là mã CLI (System :: String), nếu không thì nó là native mã. Tôi vẫn còn tìm hiểu thêm về nó! – Ajay

+0

Tôi nghĩ về void __fastcall foo(); Không thực sự làm việc, bit của một lỗi trình biên dịch ở đó. –

1

Chỉ thị pragma phải được chèn trực tiếp vào tệp bao gồm. Bằng cách này, ở khắp mọi nơi bạn bao gồm các tập tin một phần không được quản lý được khai báo.

Rất tiếc, bạn phải sửa đổi tệp bao gồm của mình.

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