6

次のステートメントの "(*)" 式の意味がわかりません。

#define PySpam_System \
 (*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM])

どこ

#define PySpam_System_NUM 0
#define PySpam_System_RETURN int
#define PySpam_System_PROTO (const char *command)

( http://docs.python.org/2/extending/extending.htmlからの抜粋)。それはどういう意味ですか?(ばかげた質問ですみません)。関数ポインターに似ていますが、非常に紛らわしい構文です。

更新: Shahbaz と Jonathan のおかげで、物事はほぼ明確になってきましたが、まだ 2 つのニュアンスを得ることができません。

  1. なぜconst char *command、それだけではありませんconst char *。関数ポインタの型宣言と型変換で引数の名前を省略したほうがいいと思った?では、省略してはいけません。省略してもよいのでしょうか。
  2. (*(int (*)(const char *command))だけでなく、なぜ(int (*)(const char *command)ですか?外側の(*[ここにある他のすべて]の目的は何)ですか? 関数自体への関数ポインタのオプションの逆参照ですよね?
4

2 に答える 2

7
PySpam_System_RETURN (*)PySpam_System_PROTO

次のように展開されます。

int (*)(const char *command)

これは関数ポインタ型です。したがって、基本的には次のとおりです。

(*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM])

これは次のように変換されます。

(*(int (*)(const char *command)) PySpam_API[0])

引数と戻り値PySpam_API[0]を持つ関数であるかのようにの値を呼び出しています (関数ポインタへのキャスト)。これにはまだ引数がないことに注意してください。したがって、マクロを使用する人は誰でも、次のような引数を与える必要があります。const char*int

PySpam_System("some string");

更新時:

  1. 引数名はオプションです。彼らはただ書いたかもしれませんconst char *。名前はわかりやすくするために書かれたものだと思います。今のところ、他を見なくても、関数がコマンドを受け取ることがわかったので、役に立ったと言えます。
  2. 繰り返しますが、あなたは正しいです。イニシャル*は、関数ポインターを逆参照します。C では、これは非常にオプションです。ポインターを逆参照しているので、それを置くとより対称になりますが、関数ポインターを逆参照しないことは意味がないため、逆参照しないと違いはありません.Cは唯一の正しいことをしますあなたのために。******実際、 1つだけではなく入れても機能します。
于 2013-04-10T16:50:29.710 に答える