2009-05-13 3 views
0

кто знает, почему это не работает, когда я пытаюсь включить библиотеку со следующими декларациями:константа C++ в библиотеке; не работает

namespace wincabase 
{ 
    const char* SOMESTRING = "xx"; 
} 

В то время как это прекрасно:

namespace wincabase 
{ 
    const int X = 30; 
} 

я получаю «несколько определений «ошибка с gcc для первого случая, когда я связываю lib. Благодаря!

ответ

5

const char * означает указатель на const char. Это означает, что сам указатель не постоянный.

Следовательно, это обычная переменная, так что вам нужно использовать

extern const char* SOMESTRING; 

в заголовочном файле, и

const char* SOMESTRING = "xx"; 

в одном модуле компиляции библиотеки.


В качестве альтернативы, если это означало быть Const указатель на константный полукокса, то вы должны использовать:

const char* const SOMESTRING = "xx"; 
2

Вы объявляя указатель константным, а затем указав его строковый литерал, определенный в модуле компиляции, поэтому вы должны дублировать строковый литерал, если вы использовали его в файле заголовка. Что вам нужно сделать, это объявить указатель в файле заголовка и определить строку в исходном файле в библиотеке.

Заголовок:

extern const char* SOMESTRING; 

В некоторых исходного файла в библиотеке:

const char* SOMESTRING = "xx"; 
1

Вы должны объявить и определить их seprately:

Plop.h 
====== 
namespace wincabase 
{ 
    extern const char* SOMESTRING; // declare 
} 

Plop.cpp 
======== 
const char* wincabase::SOMESTRING = "xx"; // define 
2

Помимо подхода Tobi отметил, :

const char* const SOMESTRING = "xx"; 

другой альтернативы, чтобы объявить его как сопзЬ характера в массив:

const char SOMESTRING[] = "xx"; 

Этот подход потенциально обеспечивает компилятор с дополнительными возможностями оптимизации, такие как размещение строки в режиме только для чтения разделе полученный двоичный; хотя, возможно, компилятор может выполнить аналогичные оптимизации с первым подходом.

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