2013-12-14 4 views
1

У меня есть одна проблема с именами. В нем говорится «Множественное определение phys1 :: x», почему? Посмотрите на мой код:namespaces в заголовках в C++

main.cpp

#include <cstdlib> 
#include <iostream> 
#include "abcd.h" 
using namespace phys1; 
using namespace std; 
int main(){ 
    cout << "SD " << tits() << endl; 
    system("pause"); 
    return 0; 
} 

abcd.h

#ifndef _ABCD_H_ 
#define _ABCD_H_ 
namespace phys1 
{ 
    double xx = 9.36; 
} 
double tits(); 
#endif 

abcd.cpp

#include "abcd.h" 
double tits(){ 
    return phys1::xx; 
} 
+1

Вы используете [зарезервированный идентификатор ] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier). – chris

+0

@chris: для детей-программистов очень часто использовать зарезервированные идентификаторы только **, потому что ** они зарезервированы. Это как сказать мальчику «не трогай это». Я видел это злоупотребление снова и снова даже в известных библиотеках (и без всякой причины ... «ABCD_H_INCLUDED» выглядел бы еще лучше). – 6502

+0

@MarounMaroun sure: D – rint

ответ

5

double xx = 9.36; это определение, и вы можете» t определяет один и тот же символ для нескольких единиц перевода.

Вы можете использовать const, который дает переменную внутреннюю связь, или static:

//can't modify the value 
const double xx = 9.36; 

//can modify the value 
//each translation unit has its own copy, so not a global 
static double xx = 9.36; 

или для истинного глобального, экстерном:

extern double xx; 

//cpp file 
double xx = 9.36; 
+0

Но даже если я не определяю, но просто объявляю, что это «double xx;» в пространстве имен появляется такая же ошибка! Как с этим справиться? – rint

+0

@ rint, Он по-прежнему имеет внешнюю связь. Это почти эквивалентно объявлению одного и того же глобального в разных файлах. Оба они видны друг другу, если вы не дадите им внутреннюю связь. – chris

+0

@ rint, поэтому я даю вам 3 альтернативы, и вы идете вперед и берете еще один? gg –

Смежные вопросы