プロジェクトのソースファイルの1つで、次のC関数の定義を見つけました。
int (foo) (int *bar)
{
return foo (bar);
}
注:の横にアスタリスクがないfoo
ため、関数ポインターではありません。またはそれは?再帰呼び出しで何が起こっているのですか?
7
いいえ、それは関数ポインタではありません-fooという名前の通常の関数です。
—
Nemanja Boric、
これは完全な機能ですか?
—
asheeshr
この関数が有用なコンテキストで使用されているという証拠はありますか?
—
moooeeeep
...既存のソースでコンパイルされるかどうかを確認するために単に作成されたダミー関数のように見え、削除されているはずです。スタックオーバーフローが最悪の場合は、せいぜい無限ループ(Cコンパイラーがジャンプの末尾呼び出しを最適化できるかどうかわからない)なので、それを削除します(それが実際に機能する場合)。
—
ハイド
C宣言の括弧は、言語があいまいであることを曖昧にするのに役立ちます。クイック、何
—
Kaz
a(b);
ですか?b
型の変数としての宣言a
?またはa
引数付きの関数の呼び出しb
ですか?違いは構文であり、の宣言情報を調べないと、構文解析の方法すらわからないa
。つまり、後置関数呼び出しの括弧、または宣言子を囲むオプションの括弧です。