変数定義が関数宣言と間違われる
例えば以下のように stdio.h をインクルードしなくとも、コンパイラは警告も何も発しません。
int main() { int puts(const char *); puts("Hello World!"); }
ローカルに宣言された関数識別子の有効範囲はそのスコープ内ですので、別のスコープ(例えば別の関数)から使用しようとするとコンパイラに怒られます。
さて、関数宣言構文は引数識別子を括弧でくくっても構いません。
つまり以下のコードは普通にコンパイルできます。
void f(int(n)) { printf("%d\n", n); }
さらに、C++では関数の引数識別子を省略してしまうことができます。
void f(int()) { cout << "?" << endl; }
そして、この識別子を括弧でくくり、識別子を省略した関数宣言はローカルに記述すると以下の様な見た目になります。
int main() { void f(int()); }
まだわかりずらいですね。
では、構造体 point を返す関数をローカルに宣言してみましょう。
int main() { point f(int(), int()); }
はい。
これは、識別子を省略した関数宣言にも、point型の変数を定義しているようにも見えます。
私の環境ではこれは関数宣言と解釈されました。
-
定義はできません↩