Есть ли способ определить, действует ли неуправляемая #pragma в C ++ / CLI? - PullRequest
10 голосов
/ 12 августа 2011

У меня есть проект, который включает некоторые чувствительные к производительности нативные заголовки C ++, в которых интенсивно используются шаблоны. Для этого проекта мы также обертываем заголовки и добавляем некоторый связующий код, чтобы представить функциональность c # и другим языкам .NET. Мы назовем этот заголовок «layout.h» и предположим, что это сторонний заголовок, который я не могу изменить.

В сборке C ++ / CLI в смешанном режиме относительно легко ошибиться и #include из места в коде, где #pragma неуправляем (или #pramga managed (push, off)). Когда это происходит, шаблоны генерируют IL, и я получаю дополнительные управляемые / неуправляемые переходы, когда выполняется код, и производительность падает.

У меня вопрос, есть ли способ сделать проверку времени компиляции непосредственно перед #include, чтобы компиляция не удалась, если я случайно #include из неправильного контекста.

// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr
    ASSERT_UNMANAGED()
    #include <layout.h>

Моя наивная 1-я попытка проверила #ifdef _MANAGED, но это всегда определяется, нахожусь ли я в неуправляемом блоке кода #pragma или нет.

Ответы [ 2 ]

1 голос
/ 12 августа 2011

Директивы прагмы должны быть вставлены непосредственно во включаемый файл.Таким образом, везде, где вы включаете файл, объявляется неуправляемый раздел.

Извините, что вам нужно изменить ваш файл включения.

1 голос
/ 12 августа 2011

Вы можете написать ASSERT_MANAGED или ASSERT_UNMANAGED код, который будет использовать конструкцию, которая доступна ТОЛЬКО при компиляции управляемого или неуправляемогоОбъявление ref class является примером, который доступен только при использовании управляемого.

Это несколько грязное решение, но оно бы сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...