встроенная сборка в C ++ / CLI - PullRequest
       3

встроенная сборка в C ++ / CLI

3 голосов
/ 05 декабря 2011

Почему компилятор C ++ / CLI может компилировать этот код:

using namespace System;

inline void Assembly(){

__asm{
mov eax,5
}

}

int main(array<System::String ^> ^args)
{

    Assembly();
    Console::WriteLine(L"Hello World");
    return 0;
}

И НЕ может для этого:

using namespace System;


int main(array<System::String ^> ^args)
{

__asm{
mov eax,5
}
    Console::WriteLine(L"Hello World");
    return 0;
}

1 Ответ

12 голосов
/ 05 декабря 2011

Компилятор C ++ / CLI поддерживает генерацию как машинного кода, так и IL.Он сгенерирует машинный код для любого кода, скомпилированного без действующего / clr, или функций, заключенных в скобки с управляемыми #pragma (push, off) и #pragma managed (pop).Или функции, которые должны быть скомпилированы в машинный код, потому что они содержат код, который нельзя преобразовать в IL.Как _asm, обратите внимание на предупреждение C4793, которое вы получили за первый фрагмент.Подавить предупреждение с помощью #pragma удалось.Такой код, конечно, не может использовать управляемые типы.

Единица генерации кода - это функция.То, что не может работать, - это функция, которая нуждается в обоих.Ваша функция main () должна быть скомпилирована в IL, потому что она использует управляемые типы.Функция не будет встроена, конечно.

...