1. ホーム
  2. c

[解決済み】関数名を囲む括弧の意味とは?

2022-04-07 22:25:42

質問

私のプロジェクトのソースファイルの1つに、次のようなC関数定義がありました。

int (foo) (int *bar)
{
    return foo (bar);
}

注意: foo ということは、関数ポインタではありません。それとも、そうなのでしょうか? この再帰的な呼び出しはどうなっているのでしょうか?

どのように解決するのですか?

プリプロセッサー的なものが動いていない場合。 foo のシグネチャは、次のものと同等です。

int foo (int *bar)

関数名の周りに不要と思われる括弧を付けるのは、関数と関数に似たマクロが同じ名前で存在し、プログラマーがマクロの展開を防ぎたい場合だけです。

この習慣は、最初は少し奇妙に思えるかもしれませんが、C ライブラリでは 同じ名前のマクロと関数をいくつか提供する .

そのような関数とマクロのペアの1つが isdigit() . ライブラリはこれを次のように定義することができる。

/* the macro */
#define isdigit(c) ...

/* the function */
int (isdigit)(int c) /* avoid the macro through the use of parentheses */
{
  return isdigit(c); /* use the macro */
}

あなたの関数は上記とほとんど同じに見えるので、あなたのコードでもこのようなことが起こっているのではないかと思います。