2011-12-04 151 views
3

爲什麼C++/CLI編譯器可以編譯此代碼:聯彙編在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; 
} 
+0

您是否收到錯誤訊息?它是否談論可達性? –

+0

@BrianCain:它爲第二個代碼提供了5個錯誤,其中之一是'錯誤錯誤C3644:'main':無法編譯生成託管代碼的函數。 – Aan

回答

11

的C++/CLI編譯器支持生成的機器代碼和IL。它將爲任何編譯時沒有使用/ clr的代碼生成機器代碼,或爲使用#pragma managed(push,off)和#pragma managed(pop)進行包圍的函數生成機器代碼。或者必須編譯爲機器代碼的函數,因爲它們包含無法轉換爲IL的代碼。像_asm一樣,請注意您爲第一個片段獲得的C4793警告。使用#pragma managed取消警告。這樣的代碼當然不能使用任何託管類型。

代碼生成單位是一個函數。無法運作的是一個需要兩個功能的功能。您的main()函數必須編譯爲IL,因爲它使用託管類型。該功能當然不會被內聯。

+1

我希望的是我可以這樣說:__asm {ldc.i4.4 ... pop ...(etc.)} –