関数ポインタの定義の一般的な形式は次のとおりです。関数ポインタ宣言 - __Pは何をしますか?
int function(int, int);
int (*ptr)(int, int);
が、私は理解していなかった、今日の形を見ました。誰でもこれを説明できますか?
int (*close) __P((struct __db *));
関数ポインタの定義の一般的な形式は次のとおりです。関数ポインタ宣言 - __Pは何をしますか?
int function(int, int);
int (*ptr)(int, int);
が、私は理解していなかった、今日の形を見ました。誰でもこれを説明できますか?
int (*close) __P((struct __db *));
__P()
マクロは、プロトタイプ(C89でCに導入された)がないときに、K & R Cの日からC実装をサポートするために通常使用されます。基本的にロジックは
#if SOME_LOGIC_TO_TEST_WHETHER_IMPLEMENTATION_SUPPORTS_PROTOTYPES
# define __P(argument_list) argument_list
#else
# define __P(argument_list)()
#endif
あなたの例に当てはめたときの動作を確認できますか?これが機能していない構文エラーが発生するため、引数リストは、関数呼び出し、関数のようなマクロのだけではなく、括弧の括弧を含める必要があることに注意してください。したがって、マクロが使用されるときには二重括弧が使用されます。おそらくそれが珍しいように見える理由でしょう。
関数ポインタの定義の一般的な形式です....が、私は理解していなかった今日 フォームを見ました。
ここでは特別なことはなく、魔法の構文はありません。これは、ではなく、が異なるの形式の関数ポインタ宣言です。
これは関数ポインタ宣言の標準形式に過ぎず、__P()
は、使用しているヘッダーファイルの1つで定義されたマクロです。その目的が何であるかを知るために、そのマクロ定義を見つけてください。
あるいは条件付きで引数を返すか何も返さないかもしれません。後者のケースはプロトタイプを持たないK&R Cの遺産です。古いライブラリにはまだこのハックが含まれています。 – Gene
@Gene私は '__P'が何をしようとしていませんでした。実際に私は私の推測を削除しました。私が作ろうとしていたことは、これが別の構文ではないということです。これは単なる標準構文とマクロです。 –
__P()
は単なるマクロです。次のように私のシステムではそれが(sys/cdefs.h
に)定義されています。このことから
#if defined(__STDC__) || defined(__cplusplus)
#define __P(protos) protos /* full-blown ANSI C */
#else /* !(__STDC__ || __cplusplus) */
#define __P(protos) () /* traditional C preprocessor */
#endif /* !__GNUC__ */
、(非常に)古いコンパイラとの互換性を維持するために使用されているようです。
ああ!わかった。ご回答有難うございます。 – Cruisehu
これはCかC++ですか? (いずれかの方法でタグを質問に追加してください)。 '__P'マクロが何であるか知っていますか? – Rup
C、タグを追加しました。私は_Pがマクロであるかどうかわかりません。私たちの先生がberkeleyDBのソースファイルを覚えてもらうように頼んだのですが、私はC言語ではうまくいきません。 – Cruisehu
@おそらく答えを受け入れるべきです –