どうすれば“使用しない”名前空間?
-
03-07-2019 - |
質問
私の開発システム(Codegear C ++ Builder)の気まぐれの1つは、自動生成されたヘッダーの一部が...
using namespace xyzzy
...それらのステートメント。これは、コードに必要以上に影響を与えます。
以前の「使用中」を何らかの方法でキャンセル/オーバーライドできる方法はありますか?これを避けるためのステートメント。
たぶん...
unusing namespace xyzzy;
解決
いいえ。しかし、潜在的な解決策があります。次のように、独自の名前空間でincludeディレクティブを囲むと...
namespace codegear {
#include "codegear_header.h"
} // namespace codegear
...そのヘッダー内のusingディレクティブの効果は無効化されます。
場合によっては問題が生じる可能性があります。そのため、すべてのC ++スタイルガイドでは、「名前空間を使用する」ことをしないことを強くお勧めします。ヘッダーファイルのディレクティブ。
他のヒント
いいえ、名前空間を使用しないことはできません。できることは、 using namespace
-statementにブロックを入れて、そのスコープを制限することだけです。
例:
{
using namespace xyzzy;
} // stop using namespace xyzzy here
おそらく、自動生成されたヘッダーで使用されるテンプレートを変更できます。
競合の明示的な名前空間を使用してスタックする場合があります:
string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace
今後の参照用:XEバージョン以降、#defineを使用して恐ろしいネームスペースシステムを使用することを回避できる新しい値があります。
インクルード内で:DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE
sed、perl、またはその他のコマンドラインツールをビルドプロセスの一部として使用して、生成されたヘッダーを生成後、使用前に変更する方法はどうですか?
Visual Studio 2005の簡単な実験により、これらのヘッダーを独自の名前付きネームスペースで囲み、このネームスペースから必要なものを use
できることがわかりました(ただし、 use
は使用しないでください)非表示にするネームスペースが導入されるため、ネームスペース全体。
#include<iostream>
#include<stdio.h>
namespace namespace1 {
int t = 10;
}
namespace namespace2 {
int t = 20;
}
int main() {
using namespace namespace1;
printf("%d" , t);
printf("%d" , namespace2::t);
}