このようなマクロは、さまざまな C コンパイラとの互換性のために大幅に追加されています。これは、1980 年代と 1990 年代の K&R 準拠 (以前の ANSI C) であるか、さまざまな機能が欠けているコンパイラのコードに見られます。
確実に確認するには、マクロ定義を読む必要がありますが、この種のものにはいくつかの一般的なパターンがあります。マクロはいくつかのタイプに分類されます。
リンケージ規則
を定義することによりML_EXTERN、API はさまざまな呼び出し規則(たとえば、stdcall、fastcall など)、またはさまざまな種類の外部リンケージ (たとえば、Microsoft のdllexport) をサポートできます。これにより、コードの可読性に実質的な影響を与えることなく、コンパイラの互換性とクロスプラットフォームの互換性が提供されます。
一貫した型サイズ
int、short、 などの型のビット数longはプラットフォームに依存しますが、いくつかの制限があります。inttypes.h標準およびヘッダーより前の多くのライブラリは、stdint.hマクロまたは typedef を使用して、それらの型がすべてのプラットフォームで同じサイズになるようにします。 ML_INT適切なサイズの整数型へのマクロまたは typedef です。
プロトタイプのサポート
80 年代の多くのコンパイラは、C の K&R 標準に基づいて構築されており、ANSI 関数プロトタイプをサポートしていません。ML_FUNCおよびML_ARGS_LISTマクロはこれに対処します 。
プロトタイプがサポートされている場合、ML_ARGS_LISTが定義され、ML_FUNC(x)に展開されxます。ML_EXTERNandを無視した完全な展開は次の_ML_ABようになります。
M_Process(ML_INT i)
コンパイラがプロトタイプをサポートしていない場合は、次にML_FUNC(x)展開されx()、プロトタイプ引数リストは省略されます。完全な展開は次のようになります。
M_Process()
K&R C では、すべての引数はルールに従って強制され、パラメーター変数は宣言ではなく関数が定義されている場所で定義されます。C バージョンの違いの詳細については、ウィキペディアの C に関するエントリを参照してください。