あなたの質問は2つに分けることができます:
1。 "どのようにグローバル機能を隠すことができますか?"
これを行う簡単な方法の1つは、関数のヘッダーをヘッダーファイルに入れるには NOT です。
//============================
// 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。 "匿名の名前空間は、グローバルな機能を隠す良い方法ですか?"
"匿名ネームスペース"技術は、グローバル関数を隠す別の方法です。
同様の質問があります:
無名/匿名名前空間対静的関数
しかし、個人的には、このテクニックを「好きな」答えとしてはお勧めしません。
ネームスペースは、「純粋なc」または「c ++」の開始以来存在したいと望むものの1つです。しかし、 "匿名の名前空間"や "名前のない名前空間"は、使用するのが奇妙なようです。
それは何かを隠そうとするようなものだし、後で、それをどこに保管しているのか忘れてしまう。
3つの追加の提案
(a)ファイルごとにオプションの非匿名の名前空間ではなく、必須という単一の主な機能を使用することをお勧めします。ネストされた追加の内部名前空間を持つことがあります。それぞれのメイン名前空間は、同じIDを持つ必要があります。ファイル拡張子やファイルサフィックスは使用しません。
(b)匿名の名前空間を避ける。それは索引なしで倉庫に物を保管するようなものです。
(c)C ++ファイルであっても、ヘッダーファイルにファイル拡張子、つまりファイルプレフィックス(多分 ".h"または ".hpp")を使用します。標準では、c ++は "c ++"ファイルに対してファイル拡張子やファイルサフィックスを使用すべきではないが、ファイルシステムを識別したり見つけたりすることは難しいという。
がんばろう。