インターネットでコードを調べていたところ、次のものを見つけました:
float * (*(*foo())[SIZE][SIZE])()
この宣言をどのように読めばいいのでしょうか? このような複雑な宣言を読むための特定のルールはありますか?
ベストアンサー1
しばらくやってなかったよ!
から始めfoo
て右に進みます。
float * (*(*
foo()
)[SIZE][SIZE])()
foo は引数のない関数です...
閉じ括弧があるので右には行けません。左に進んでください:
float * (*(
* foo()
)[SIZE][SIZE])()
fooは引数を持たずポインタを返す関数です
これ以上左には行けないので、括弧を越えて再び右に行きましょう
float * (*
(* foo())
[SIZE][SIZE])()
float * (*
(* foo())[SIZE]
[SIZE])()
float * (*
(* foo())[SIZE][SIZE]
)()
foo は引数のない関数で、SIZE の配列へのポインターを返します。
閉じ括弧に到達し、再び左に進んでポインター シンボルに到達します。
float * (
*(* foo())[SIZE][SIZE]
)()
foo は引数のない関数で、SIZE 個のポインターの配列へのポインターを返します。
左括弧が再びあるので、それを越え、再び右に進みます。
float *
( *(* foo())[SIZE][SIZE])
()
float *
( *(* foo())[SIZE][SIZE])()
foo は引数のない関数で、SIZE 個の配列へのポインターを返します。引数のない関数への SIZE 個のポインターの配列です...
そして最後に
float * ( *(* foo())[SIZE][SIZE])()
foo は引数のない関数で、SIZE の配列へのポインタを返します。引数のない関数へのポインタで、float へのポインタを返します。
そして、これを書いた人は、次の使い方を教えてあげてくださいtypedef
:
// Function that returns a pointer to float
typedef float* PFloatFunc ();
// Array of pointers to PFloatFunc functions
typedef PFloatFunc* PFloatFuncArray2D[SIZE][SIZE];
// Function that returns a pointer to a PFloatFuncArray2D
PFloatFuncArray2D* foo();