2013-04-20 62 views
7

関数ポインタの定義の一般的な形式は次のとおりです。関数ポインタ宣言 - __Pは何をしますか?

int function(int, int); 
int (*ptr)(int, int); 

が、私は理解していなかった、今日の形を見ました。誰でもこれを説明できますか?

int (*close) __P((struct __db *)); 
+0

これはCかC++ですか? (いずれかの方法でタグを質問に追加してください)。 '__P'マクロが何であるか知っていますか? – Rup

+1

C、タグを追加しました。私は_Pがマクロであるかどうかわかりません。私たちの先生がberkeleyDBのソースファイルを覚えてもらうように頼んだのですが、私はC言語ではうまくいきません。 – Cruisehu

+0

@おそらく答えを受け入れるべきです –

答えて

11

__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 

あなたの例に当てはめたときの動作を確認できますか?これが機能していない構文エラーが発生するため、引数リストは、関数呼び出し関数のようなマクロのだけではなく、括弧の括弧を含める必要があることに注意してください。したがって、マクロが使用されるときには二重括弧が使用されます。おそらくそれが珍しいように見える理由でしょう。

+0

あなたの答えをありがとう。私たちの先生は、berkeleyDBのソースファイルを覚えてください。私はちょうどその時点で立ち往生していました。私はCをうまく使いません。私はCについてもっと学ぶべきだと思っています。 – Cruisehu

+0

@Maybe_hu素晴らしい言語であり、C++よりもはるかに簡単でエレガントです(**はスーパーセットではありません) Cの、しかし文法や歴史を共有するまったく別の言語)。 – Jens

+0

私にとっては、どの書籍やウェブサイトを読むべきですか?私にはいくつかお勧めできますか? – Cruisehu

2

関数ポインタの定義の一般的な形式です....が、私は理解していなかった今日 フォームを見ました。

ここでは特別なことはなく、魔法の構文はありません。これは、ではなく、が異なるの形式の関数ポインタ宣言です。

これは関数ポインタ宣言の標準形式に過ぎず、__P()は、使用しているヘッダーファイルの1つで定義されたマクロです。その目的が何であるかを知るために、そのマクロ定義を見つけてください。

+0

あるいは条件付きで引数を返すか何も返さないかもしれません。後者のケースはプロトタイプを持たないK&R Cの遺産です。古いライブラリにはまだこのハックが含まれています。 – Gene

+0

@Gene私は '__P'が何をしようとしていませんでした。実際に私は私の推測を削除しました。私が作ろうとしていたことは、これが別の構文ではないということです。これは単なる標準構文とマクロです。 –

9

__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__ */ 

、(非常に)古いコンパイラとの互換性を維持するために使用されているようです。

+0

ああ!わかった。ご回答有難うございます。 – Cruisehu

関連する問題