スタンドアロンの C++ 関数にはヘッダー ファイルとコード ファイルが必要ですか?
他の C++ クラスを使用する C++ 関数をいくつか書いていますが、クラス自体には属していません。それらはdllでコンパイルされることを意図しているので、それらを別のヘッダーファイルで宣言する必要があるのか 、それとも宣言を.ccファイルに入れることができる/すべきなのか疑問に思っていました。
たぶん、これはただの悪い習慣でしょうか?
スタンドアロンの C++ 関数にはヘッダー ファイルとコード ファイルが必要ですか?
他の C++ クラスを使用する C++ 関数をいくつか書いていますが、クラス自体には属していません。それらはdllでコンパイルされることを意図しているので、それらを別のヘッダーファイルで宣言する必要があるのか 、それとも宣言を.ccファイルに入れることができる/すべきなのか疑問に思っていました。
たぶん、これはただの悪い習慣でしょうか?
ヘッダー ファイルは、別の翻訳単位で宣言されている関数について他のソース ファイルに知らせることができるので便利です。
これは、呼び出しているものが型チェッカーに対して正しいことをコンパイラがチェックできるようにするために必要です。しかし、その必要性は、ヘッダー ファイルの存在によるものではなく、宣言自体によるものです。
DLLの場合、私の記憶が正しければ、関数を使用するたびに関数のシグネチャを宣言するという理由だけで、それを行う必要はありません。
extern C __declspec(dllimport) void foo();
もちろん、これはとにかくそれらを前方宣言する必要があることを意味するので、DLL のヘッダー ファイルを作成しても問題はないと思います。すべての署名が一緒に保持されるだけです。
関数が定義されているソース ファイルの外で関数を使用する場合は、絶対に宣言が必要です。一貫性を保つために、宣言をヘッダー ファイルに入れるのが最善です。そうしないと、同じことを繰り返すことになり、潜在的なバグの原因となるだけです。
厳密に必要というわけではありませんが、強くお勧めします。
関数宣言をヘッダー ファイルに配置し、関数定義をソース (.cc) ファイルに配置します。動機は、ユーザー (ここでは、仲間のプログラマー) がインターフェイスのみを表示できるようにすることです (実装は変更される可能性があるため)。さらに、他のソース ファイルがヘッダー ファイルをインクルードし、提供された関数を使用できるようにします。
唯一の例外は静的関数です。これらは、ソース ファイルの外部で表示または使用することを想定していないため、ヘッダー ファイルで宣言しないでください。