このようなマクロは、さまざまな 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_EXTERN
andを無視した完全な展開は次の_ML_AB
ようになります。
M_Process(ML_INT i)
コンパイラがプロトタイプをサポートしていない場合は、次にML_FUNC(x)
展開されx()
、プロトタイプ引数リストは省略されます。完全な展開は次のようになります。
M_Process()
K&R C では、すべての引数はルールに従って強制され、パラメーター変数は宣言ではなく関数が定義されている場所で定義されます。C バージョンの違いの詳細については、ウィキペディアの C に関するエントリを参照してください。