#3
by かずま » 5年前
unsinged __stdcall mythreadHoge(int i)
unsinged __cdecl mythreadHoge(int i)
unsinged mythreadHoge(int i) // これは __cdecl と同じ
どれでも構いません。
_beginthreadex の第3引数は、__stdcall宣言された関数へのポインタ
でなければなりません。
関数を呼び出すとき、引数をスタックに積みますが、
__stdcall 宣言された関数は、呼び出し元に戻るときに
関数側でスタックを元に戻します。
__cdecl 宣言された関数は、関数側でスタックを元に戻さないので、
戻った後、呼び出し側でスタックを元に戻すコードが必要です。
C++ では宣言なしに関数を呼び出せないので問題ありませんが、
C では、宣言なしに関数を呼び出せるし、double sqrt(); のように
引数の指定がない宣言も許されるので、__stdcall宣言された関数を
__cdecl宣言された関数だと思って呼び出してしまう可能性があります。
そうならないように、__stdcall 宣言された関数はコンパイルされると
関数名の後に @8 のように引数のバイト数が付加された関数名に変更され、
間違ったリンクがされないようになっています。
unsinged __stdcall mythreadHoge(int i)
unsinged __cdecl mythreadHoge(int i)
unsinged mythreadHoge(int i) // これは __cdecl と同じ
どれでも構いません。
_beginthreadex の第3引数は、__stdcall宣言された関数へのポインタ
でなければなりません。
関数を呼び出すとき、引数をスタックに積みますが、
__stdcall 宣言された関数は、呼び出し元に戻るときに
関数側でスタックを元に戻します。
__cdecl 宣言された関数は、関数側でスタックを元に戻さないので、
戻った後、呼び出し側でスタックを元に戻すコードが必要です。
C++ では宣言なしに関数を呼び出せないので問題ありませんが、
C では、宣言なしに関数を呼び出せるし、double sqrt(); のように
引数の指定がない宣言も許されるので、__stdcall宣言された関数を
__cdecl宣言された関数だと思って呼び出してしまう可能性があります。
そうならないように、__stdcall 宣言された関数はコンパイルされると
関数名の後に @8 のように引数のバイト数が付加された関数名に変更され、
間違ったリンクがされないようになっています。