変数定義が関数宣言と間違われる

C、C++はローカルに関数を宣言できます。1

例えば以下のように 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型の変数を定義しているようにも見えます。

私の環境ではこれは関数宣言と解釈されました。


  1. 定義はできません