例のSNSで、こんな投稿を見つけました。
C++って後の行で宣言してる関数をそれより前で呼び出せないのか
— とろちゃ🐉 (@trooooche) January 22, 2024
やり方あるのかもしれんけど意外
これに対しプロトタイプ宣言に言及する返信が複数ついていますが、プロトタイプ宣言は宣言です。
よって、「後の行で宣言してる関数」という条件を骨抜きにしてしまい、つまらないです。
とはいえ、「後の行で宣言してる関数」という条件だけで、「前の行で宣言していない」という条件は無いので、無効ではないでしょう。
さて、C++で後の行で宣言し、前の行では宣言していない関数を呼び出すことはできます。
たとえば、条件付きコンパイルと自分自身のインクルードにより、宣言を呼び出しより先にコンパイルするようにすることで実現できます。
#include <iostream>
#ifdef IS_2ND_STAGE
int main() {
test(); // 関数の呼び出し
return 0;
}
#else
void test() { // 関数の宣言 (兼定義)
std::cout << "hello from test()!\n";
}
#define IS_2ND_STAGE
#include __FILE__
#endif
また、関数ポインタを使うことでもできます。
#include <iostream>
void helper(void (*func)()) {
func(); // 関数の呼び出し
}
void test() { // 関数の宣言 (兼定義)
std::cout << "hello from test()!\n";
}
int main() {
helper(test);
return 0;
}
なお、これらしか方法が無いとは限らないでしょう。