C++/CLI中的内联汇编

3

为什么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;
}

你是否收到了错误信息?它是否涉及可达性问题? - Brian Cain
@BrianCain:第二段代码出现了5个错误,其中一个是“错误1 错误C3644:'main':无法编译生成托管代码的函数”。 - Aan
1个回答

13

C++/CLI编译器支持生成机器代码和IL。它将为任何在未启用/clr的情况下编译的代码或使用#pragma managed(push, off)和#pragma managed(pop)括起来的函数生成机器代码,或者包含无法转换为IL的代码的函数生成机器代码。比如_asm,在第一个代码片段中出现了C4793警告。可以使用#pragma managed抑制该警告。当然,这样的代码不能使用任何托管类型。

代码生成的单位是函数。不能工作的是需要两者的函数。由于main()函数使用了托管类型,因此必须将其编译为IL。当然,该函数不会被内联。


1
我希望能够说出这样的话:__asm { ldc.i4.4 ... pop ... (等等) } - Glenn Slayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接