複雑なC宣言 質問する

複雑なC宣言 質問する

インターネットでコードを調べていたところ、次のものを見つけました:

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();

おすすめ記事