「関数...マクロでも定義できます」をどのように説明できますか?

「関数...マクロでも定義できます」をどのように説明できますか?

公開記録のために人々がより簡単にアクセスできるように、標準化されたメーリングリストではなくSEに依頼します。

関数(または関数型インタフェース)を指定するほぼすべてのヘッダーには、次の内容があります。

以下は関数として宣言する必要があるか、マクロとして定義できます。機能的なプロトタイプを提供する必要があります。

これは何人かの人々にとってそのような意味を持つことができるので私を悩ませます。機能私が使ったものは関数ポインタに割り当てられないかもしれません。可能次のように定義されます。マクロ

ただし、2番目の部分(「プロトタイプを提供する必要があります」)は、次の内容を表すようです。機能命名は標準で話されているものとは異なるため、他の名前には次のものが必要です。同じプロトタイプ(または少なくともすべての列挙可能な側面で互換性があります)標準で指定されたものと互換性があります。

私の説明は正しいですか?そうでない場合、実際の説明は何ですか?この段落の下にリストされているインターフェイスを関数ポインタに割り当てることはできますか?

ベストアンサー1

以下は関数として宣言する必要があるか、マクロとして定義できます。

関数がマクロとして定義されている場合、関数を参照できなくなるわけではありません。

を考慮すると、isalnum一般的にマクロです。

#include <ctype.h>
#include <stdio.h>

int main(int argc, char **argv) {
  printf("%p\n", isalnum);
  printf("%d\n", isalnum('C'));
}

今日のCでは、最初のisalnum参照はマクロにはできません。isalnumマクロの場合、マクロまたは同等であると宣言されるため、isalnum(c)パラメータのない参照は一致しません。 2番目の参照はマクロまたは関数です(コードをプリプロセッサに渡して確認できます)。後者を確認するには、括弧()を適切に#undef使用できます。(isalnum)('C')

C標準では、このステートメントの背後にある実際の要件は、この方法で導入された関数がマクロとして定義されていても、常に実際の関数として使用できることです。

機能的なプロトタイプを提供する必要があります。

プロトタイプ制作は、単に要件ではなく、他の焦点です。

extern int isalnum();

宣言されると、ヘッダファイルはすべてのパラメータの完全なプロトタイプと型情報を提供します。

バラよりC標準ライブラリのC関数をマクロとして定義参考用。

その人が言うなら機能ネーミングは標準とは異なります。

標準で指定された名前と異なる名前を持つ関数は、標準とは関係ありません(標準の一般的な要件を満たす限り)。

おすすめ記事