質問

私の開発システム(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);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top