あなたの質問は2つに分割することができます。
1.「どのようにグローバル関数を隠すことができますか?」
ませは、ヘッダファイルに関数のヘッダを置くことで、それを行うための一つの簡単な方法:
//============================
// Filename: "mylibrary.hpp"
//============================
// Description:
// Utility functions.
//============================
#ifndef MYLIBRARY_H_INCLUDED
#define MYLIBRARY_H_INCLUDED
//============================
namespace MyLibrary
{
void DoSomething();
} // namespace MyLibrary
//============================
#endif // MYLIBRARY_H_INCLUDED
//============================
完全なコードファイル:
//============================
// Filename: "mylibrary.cpp"
//============================
// Description:
// Utility functions.
//============================
// self header include
#include "mylibrary.hpp"
//============================
namespace MyLibrary
{
void DoSomethingBefore()
{
// ...
}
void DoSomethingAfter()
{
// ...
}
void DoSomethingConfirmed()
{
// ...
}
void DoSomething()
{
DoSomethingBefore();
DoSomethingConfirmed();
DoSomethingAfter();
}
} // namespace MyLibrary
//============================
#endif // MYLIBRARY_H_INCLUDED
//============================
これがコンパイルされます「mylibrary.o」または「mylibrary.obj」ファイルが作成されます。他の開発者には、 "mylibrary.hpp"と "mylibrary.obj"を追加することができますが、 "mylibrary.cpp"ファイルは必要ありません。ほとんどの "プレーンc"/"C++"コンパイラはこのように動作します。
他の方法もありますので、次のセクションをお読みください。
2.「匿名の名前空間は、グローバル関数を隠す良い方法ですか?」
グローバル機能を非表示にするもう1つの方法は、「匿名ネームスペース」手法です。 「お気に入り」の答えとして
Unnamed/anonymous namespaces vs. static functions
しかし、個人的に、私はこの手法をお勧めしません、:
にも同様の問題があります。
名前空間は、「純粋なc」または「C++」の開始以来存在していたことの1つです。しかし、 "匿名の名前空間"や "名前のない名前空間"は、使用するのが奇妙なようです。
これは、何かを隠そうとするようなもので、後で、あなたはそれをどこに保存しますか。
3つの追加の提案
は、(a)は、私は単一のメインREQUIRED、ファイルごとのオプションではない、非匿名の名前空間を使用することをお勧めします。ネストされた追加の内部名前空間を持つことがあります。それぞれのメイン名前空間は、同じIDを持つ必要があります。ファイル拡張子やファイルサフィックスは使用しません。
(b)匿名の名前空間は使用しないでください。それは索引なしで倉庫に物を保管するようなものです。
(c)C++ファイルの場合でも、ヘッダーファイルにファイル拡張子、またはファイルプレフィックスを使用します。おそらく ".h"または ".hpp"となります。標準では、C++は "C++"ファイルに対してファイル拡張子やファイルサフィックスを使用すべきではないが、ファイルシステムを識別したり見つけたりすることは難しいという。
Good Luck。
「静的」にするのはなぜでしょうか? (静的なクラスメソッドではなく静的なC関数の場合と同じように) –
@JamesMcLaughlin:C++では03静的な静的なメソッドは非推奨です。ただし、C++ 11ではこれを非推奨にしています。しかし、静的で無名の名前空間にあるということは、異なることを意味します。 'static'は内部リンケージを与えるので、関数はいくつかの目的のために使用することはできません。 –
あなたの提案をありがとう。 これらのソリューションは、静的な名前空間または未使用の名前空間のいずれかですが、推奨されているか優先されていますか? – user1192880