私は C++ を学び始めたばかりなので、私の無知に耐えなければなりません。関数を使用する関数の前に記述せずに参照できるように関数を宣言する方法はありますか。私は1つのcppファイル(私の決定ではありません)で作業しており、関数は自分自身を呼び出すため、それらを配置する適切な順序は実際にはありません.関数を使用する前に#define関数を定義する方法はありますか? それとも、実際にクラスの一部であることを必要としないスコープ演算子でそれらにタグを付ける方法はありますか?
前もって感謝します
関数プロトタイプは、実装する前に作成できます。関数プロトタイプは、関数、その戻り値の型、およびその引数の型に名前を付けます。関数の呼び出しの上にある必要があるのは、プロトタイプだけです。次に例を示します。
// prototype
int your_function(int an_argument);
// ...
// here you can write functions that call your_function()
// ...
// implementation of your_function()
int your_function(int an_argument) {
return an_argument + 1;
}
必要なのは関数宣言(別名プロトタイプ) です。宣言は、本体のない関数の戻り値の型、名前、および引数リストです。これらは通常、ヘッダー ファイルにありますが、そうである必要はありません。次に例を示します。
#include< stdio >
using namespace std;
void bar( int x ); // declaration
void foo( int x ); // declaration
int main() {
foo( 42 ); // use after declaration and before definition
return 0;
}
void foo( int x ) { // definition
bar( x ); // use after declaration and before definition
}
void bar( int x ) { // definition
cout << x;
}
あなたが言及しているのは関数プロトタイプだと思います。
これは、ヘッダー ファイルで関数のプロトタイプを定義する場所ですが、ソース (.cpp) ファイルで実装を定義します。
関数を参照する必要があるソース コードには、関数呼び出しを呼び出している関数の引数と戻り値に関連付けるのに十分な情報をコンパイラに提供するヘッダー ファイルを含めるだけです。
リンク段階でのみ、関数「シンボル」がソース ファイルに対して解決されます。この時点で関数の実装が存在しない場合は、未解決のシンボルが取得されます。
次に例を示します。
ライブラリ ヘッダー ファイル - library.h
// This defines a prototype (or signature) of the function
void libFunction(int a);
ライブラリ ソース (.cpp) ファイル - library.cpp
// This defines the implementation (or internals) of the function
void libFunction(int a)
{
// Function does something here...
}
クライアントコード
#include "library.h"
void applicationFunction()
{
// This function call gets resolved against the symbol at the linking stage
libFunction();
}
はい。関数の署名をファイルの先頭またはヘッダー (.h) ファイルに配置します。
そう:
void OtherFunc(int a);
void SomeFunc()
{
OtherFunc(123);
}
void OtherFunc(int a)
{
...
}
クラス メンバー関数は、クラスのインターフェイスを定義するヘッダーで宣言されます。このヘッダー ファイルは、実装を含む CPP ファイルの先頭またはその近くに含める必要があります。したがって、すべての宣言が既に含まれているため、メンバー関数が CPP ファイルで定義されている順序は関係ありません。
あなたの質問から、あなたは無料の関数を書くことを考えていると想像できます。フリー関数の宣言にも同じ手法を使用できます。ただし、フリー関数が多すぎることに注意してください。