2016-11-15 5 views
4

次のコードはコンパイルできます"#define A"が "namespace A {}"を妨害するのはなぜですか?

namespace A{ 
    int i; 
} 
namespace B{ 
    int i; 
} 
int main(){ return 0; } 

しかし、次のコードはコンパイルできません:名前はなぜ私がABを定義した後

#define A 
#define B 

namespace A{ 
    int i; 
} 
namespace B{ 
    int i; 
} 
int main(){ return 0; } 

エラー情報が

error: redefinition of 'int {anonymous}::i'

です名前空間の名前は匿名になりますか?

使用されているコンパイラ:gcc-4.9.3。

あなたは何もないように ABを定義

#define A 
#define B 

namespace A{ 
    int i; 
} 
namespace B{ 
    int i; 
} 

答えて

13

。つまり、コードは

namespace { 
    int i; 
} 
namespace { 
    int i; 
} 

になります。プリプロセッサを実行した後。両方の名前空間が匿名の名前空間になるので、コンパイラは正しくiを再宣言していると不満を持ちます。

何かを定義するとき、プリプロセッサはあなたのソースコードを実行し、そのシンボルのすべての出現を、あなたが定義したものに置き換えます。あなたはその後、プリプロセッサは、プリプロセッサの作品がご覧方法の詳細については

namespace LONG_NAME_I_DO_NOT_WANT_TO_TYPE{ 
    int i; 
} 
namespace ANOTHER_LONG_NAME_THAT_I_ALSO_DO_NOT_WANT_TO_TYPE{ 
    int i; 
} 

なるようにコードを変更します

#define A LONG_NAME_I_DO_NOT_WANT_TO_TYPE 
#define B ANOTHER_LONG_NAME_THAT_I_ALSO_DO_NOT_WANT_TO_TYPE 

namespace A{ 
    int i; 
} 
namespace B{ 
    int i; 
} 

を行っていた:GCC - The C Preprocessor

+0

これは、すべて大文字の定数があるべきことを正確な理由です避ける – Slava

関連する問題