naked (C++)

Microsoft 固有の仕様

naked 属性を指定して宣言されている関数の場合、コンパイラでプロローグおよびエピローグ コードのないコードが生成されます。 この機能を使用して、プロローグとエピローグのコード シーケンスをインライン アセンブラー コードで独自に記述できます。 naked 関数は、仮想デバイス ドライバーの記述用に特に便利です。 naked 属性は x86 と ARM でのみ有効であり、x64 では使用できないことに注意してください。

構文

__declspec(naked) declarator

解説

naked 属性は関数の定義だけに関連し、型修飾子には関連しないため、naked 関数は拡張属性構文と __declspec キーワードを使用する必要があります。

コンパイラは、関数もまた __forceinline キーワードでマークされていても、naked 属性でマークされた関数のインライン関数を生成できません。

メンバーではないメソッドの定義以外のすべてに naked 属性が適用されている場合、コンパイラ エラーが発生します。

次のコードは naked 属性の関数を定義します。

__declspec( naked ) int func( formal_parameters ) {}

または、次のようにします。

#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}

naked 属性は、関数のプロローグとエピローグのコード シーケンスをコンパイラが生成するかどうかにのみ影響を与えます。 このような関数を呼び出すために生成されるコードには影響を与えません。 したがって、naked 属性は関数の型の一部と見なされず、関数ポインターは naked 属性を持つことができません。 さらに、naked 属性は、データ定義に適用できません。 たとえば、次のサンプル コードはエラーになります。

__declspec( naked ) int i;
// Error--naked attribute not permitted on data declarations.

naked 属性は、関数定義にだけ関連し、関数のプロトタイプでは指定できません。 たとえば、次の宣言はコンパイラ エラーになります。

__declspec( naked ) int func();  // Error--naked attribute not permitted on function declarations

Microsoft 固有の仕様はここまで

関連項目

__declspec
キーワード
naked 関数呼び出し