У меня есть проект, который включает некоторые чувствительные к производительности нативные заголовки C ++, в которых интенсивно используются шаблоны. Для этого проекта мы также обертываем заголовки и добавляем некоторый связующий код, чтобы предоставить функциональность C # и другим языкам .NET. Мы назовем этот заголовок «layout.h» и предположим, что это сторонний заголовок, который я не могу изменить.
В смешанном режиме сборки C ++ / CLI относительно легко сделать ошибку и # включить из места в коде, где #pragma unmanaged (или #pramga managed (push, off)). Когда это происходит, шаблоны генерируют IL, и я получаю дополнительные управляемые / неуправляемые переходы при запуске кода, и производительность падает.
Мой вопрос заключается в том, есть ли способ выполнить проверку во время компиляции непосредственно перед # include, чтобы компиляция завершилась неудачей, если я случайно #including из неправильного контекста.
// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr
ASSERT_UNMANAGED()
#include <layout.h>
Моя наивная первая попытка проверила #ifdef _MANAGED, но это всегда определяется, нахожусь ли я в неуправляемом блоке кода #pragma или нет.