1
ML_EXTERN _ML_AB ML_FUNC(M_Process)
#ifdef ML_ARGS_LIST
(
  ML_INT i
);
#endif

ベンダー (これらのインターフェースを実装する必要があるベンダー) 向けのインターフェースを作成している場合、API で上記の宣言を行う必要があるのはなぜですか? 私はそれがマクロと呼ばれていると思います-「通常」のように関数を宣言しないのはなぜint M_Process();ですか? 上記の宣言のさまざまな部分との違いは何ですか?

4

1 に答える 1

4

このようなマクロは、さまざまな C コンパイラとの互換性のために大幅に追加されています。これは、1980 年代と 1990 年代の K&R 準拠 (以前の ANSI C) であるか、さまざまな機能が欠けているコンパイラのコードに見られます。

確実に確認するには、マクロ定義を読む必要がありますが、この種のものにはいくつかの一般的なパターンがあります。マクロはいくつかのタイプに分類されます。

リンケージ規則

を定義することによりML_EXTERN、API はさまざまな呼び出し規則(たとえば、stdcall、fastcall など)、またはさまざまな種類の外部リンケージ (たとえば、Microsoft のdllexport) をサポートできます。これにより、コードの可読性に実質的な影響を与えることなく、コンパイラの互換性とクロスプラットフォームの互換性が提供されます。

一貫した型サイズ

intshort、 などの型のビット数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 に関するエントリを参照してください。

于 2013-07-10T19:04:59.730 に答える