コンパイラの警告 (レベル 1 および 3) C4793
'関数' : 関数はネイティブ コードとしてコンパイルされています: '理由'
/clr コンパイラ オプションが指定されていますが、コンパイラが '関数' をマネージ コードにコンパイルできません。その代わりに、コンパイラは警告 C4793 および内容を説明する継続メッセージを生成して、'関数' をネイティブ コードにコンパイルします。この継続メッセージには、関数を MSIL にコンパイルできない理由を説明する理由テキストが含まれます。
これは、/clr:pure コンパイラ オプションを指定したときのレベル 1 の警告です。
次の表は、生成される可能性のあるすべての継続メッセージの一覧です。
理由メッセージ |
解説 |
---|---|
整列データ型はマネージ コードでサポートされていません |
CLR は必要に応じてデータの割り当てができる必要がありますが、データが、__m128 や align などの宣言を使用して整列されている場合に、これができない場合があります。 |
'__ImageBase' を使用する関数はマネージ コードでサポートされていません |
__ImageBase は、通常は DLL をロードするときに低水準のネイティブ コードだけが使用する特殊リンカー シンボルです。 |
'/clr' コンパイラ オプションでは vararg がサポートされていません |
ネイティブ関数は可変個引数リスト (varargs) を持つマネージ関数を呼び出せません。関数のスタック レイアウト要件が異なるためです。ただし、/clr:pure コンパイラ オプションを指定した場合、アセンブリにはマネージ関数しか入れられないため、可変個引数リストがサポートされます。詳細については、「純粋なコードと検証可能なコード (C++/CLI)」を参照してください。 |
64 ビット CLR は __ptr32 修飾子で宣言されたデータをサポートしていません |
ポインターは、現在のプラットフォームにあるネイティブ ポインターと同じサイズでなければなりません。詳細については、「__ptr32、 __ptr64」を参照してください。 |
32 ビット CLR は __ptr64 修飾子で宣言されたデータをサポートしていません |
ポインターは、現在のプラットフォームにあるネイティブ ポインターと同じサイズでなければなりません。詳細については、「__ptr32、 __ptr64」を参照してください。 |
1 つまたは複数の組み込みはマネージ コードでサポートされていません |
メッセージが生成された時点で組み込みの名前が使用できません。ただし、このメッセージの原因となる組み込みは、通常、低水準のマシン語命令を表します。 |
インラインのネイティブ アセンブリ ('__asm') はマネージ コードでサポートされていません |
インライン アセンブラー コードには、任意のネイティブ コードを入れられますが、これは管理できません。 |
非 __clrcall 仮想関数のサンクはネイティブとしてコンパイルする必要があります |
非 __clrcall 仮想関数のサンクは、アンマネージ アドレスを使用する必要があります。 |
'_setjmp' を使用する関数はネイティブとしてコンパイルする必要があります |
CLR はプログラムの実行を制御できる必要があります。ただし、setjmp 関数は、レジスタや実行状態など、低水準の情報を保存し格納することによって、通常のプログラム実行をバイパスします。 |
使用例
次の例では C4793 エラーが生成されます。
// C4793.cpp
// compile with: /c /clr /W3
// processor: x86
int asmfunc(void) { // C4793, compiled as unmanaged, native code
__asm {
mov eax, 0
}
}
次の例では C4793 エラーが生成されます。
// C4793_b.cpp
// compile with: /c /clr /W3
#include <setjmp.h>
jmp_buf test_buf;
void f() {
setjmp(test_buf); // C4793 warning
}