определяют strInterface в interface.hПочему существуют различия между char * и char [] в случае множественного определения?
// interface.h #ifndef INTERFACE_H_ #define INTERFACE_H_ const char* strInterface = "the difference between char* and char array"; #endif
в классе OneUsing, strInterface строка называется
// oneUsingInterface.h #ifndef ONEUSINGINTERFACE_H_ #define ONEUSINGINTERFACE_H_ class OneUsing { private: int mData; public: OneUsing(); OneUsing(int a); void print(); }; #endif // ONEUSINGINTERFACE_H_ // oneUsingInterface.cpp #include "oneUsingInterface.h" #include "interface.h" #include <iostream> using namespace std; OneUsing::OneUsing() {} OneUsing::OneUsing(int a) { mData = a; } void OneUsing::print() { cout<<"mData: "<<mData<<" strInterface: "<<strInterface<<endl; }
в main.cpp, interface.h входит в strInterface является вызываемый непосредственно; он также включает oneUsingInterface.h, поскольку экземпляр OneUsing будет создан.
//main.cpp #include <iostream> #include "interface.h" #include "oneUsingInterface.h" using namespace std; int main() { cout<<strInterface<<endl; OneUsing* pObject = new OneUsing(5); pObject->print(); }
Теперь вопрос, возникающий:
g++ -I../boost_1_52_0/installation/prefix/include -I../boost_1_52_0/installation/prefix/lib -g -Wall -Wextra -c .//main.cpp g++ -I../boost_1_52_0/installation/prefix/include -I../boost_1_52_0/installation/prefix/lib -g -Wall -Wextra -c .//oneUsingInterface.cpp g++ -I../boost_1_52_0/installation/prefix/include -I../boost_1_52_0/installation/prefix/lib -g -Wall -Wextra main.o oneUsingInterface.o -o main oneUsingInterface.o:(.data+0x0): multiple definition of `strInterface' main.o:(.data+0x0): first defined here collect2: error: ld returned 1 exit status make: *** [main] Error 1
Однако, если strInterface определяется как это, нет никаких проблем, то:
// interface.h #ifndef INTERFACE_H_ #define INTERFACE_H_ const char strInterface[] = "the difference between char* and char array"; #endif
Могут ли некоторые ребята расскажите подробнее о разнице между char*
и char[]
в этом случае?
PS: мы часто объявляем глобальную переменную с ключевым словом extern
в файле заголовка, и мы определяем ее в чей-то файл реализации.