ChMap, あるいはコンパイラーの違い, の続き

一般的な calling convention(呼び出し規約)。つか Open Watcom C and C++とか gccで同じよーに指定できるもの。そしてたぶん VACPPも。

  • __cdecl
  • __stdcall
  • _Optlink
  • _System

で, それぞれの違いっつーか特徴は …

__cdecl
C言語として一般的なもの(のはず)。オブジェクトモジュールは名前の先頭に '_'が付く。スタックは呼び出し元が開放する。(ので, printf()とか可能)
__stdcall
他の言語からも使うよーなばーい(例えば PASCALとか?)。オブジェクトモジュールは, 名前の先頭に '_'と, 名前の最後に @nnnが付いて引数サイズを表す。例えば 4バイト整数を一つだけなら _func@4, 二つなら _func@8, みたいな。なので, 同じ関数名で複数定義できる(必要があるもの)。スタックは関数(?)側が開放する。(ので printf()みたいなのは無理)
_System
システムライブラリーはコレみたいな。__cdeclとほぼ同じで違いは名前の修飾がないこと。Open Watcom C and C++では _Syscallでも _Systemでも同じかも。他のコンパイラーでコンパイルするカモ なことを考慮すれば _Systemを使うのがよいかも。
_Optlink
一般的つってもそーゆー訳でもないかも知れない。_Systemと似てる感じで名前の修飾はない。スタック開放は呼び出し元。違いは, 少しばかり早くなる可能性があること。引数はスタックに積むと同時にレジスターにも保持してて, (呼び出された)関数側ではレジスターにロードする必要がない(ロード済み)。ソレは Intel 80x86系では(32bit版) eax, edx, ecx みたいな。呼び出し元が _Optlinkで関数側が _Systemでも(たぶん) 大丈夫かもだけど, その逆の組み合わせではダメなはず。
__watcall
Open Watcom C and C++だけの呼び出し規約なのかも (そのばーいのデフォルトの呼び出し規約)。_Optlinkでは最大 4バイト× 3つだけど, コレは 4つまで。ソレを越えるばーいに(越えた分だけ) スタック経由で引数が渡される。名前の(前ではなく) 後ろに '_'が付く。スタックは関数(?)側で開放する。