константа c ++ в библиотеке; не работает - PullRequest
0 голосов
/ 13 мая 2009

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

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

Хотя это прекрасно:

namespace wincabase
{
  const int X = 30;
}

Я получаю ошибку «множественные определения» с gcc для первого случая, когда я связываю библиотеку. Спасибо!

Ответы [ 4 ]

5 голосов
/ 13 мая 2009

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

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

extern const char* SOMESTRING;

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

const char* SOMESTRING = "xx";

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


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

const char* const SOMESTRING = "xx";
2 голосов
/ 13 мая 2009

Помимо подхода Тоби указал:

const char* const SOMESTRING = "xx";

другая альтернатива - объявить его как const символ массив :

const char SOMESTRING[] = "xx";

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

2 голосов
/ 13 мая 2009

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

Заголовок:

extern const char* SOMESTRING;

В каком-то исходном файле в библиотеке:

const char* SOMESTRING = "xx";
1 голос
/ 13 мая 2009

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

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

Plop.cpp
========
const char* wincabase::SOMESTRING = "xx"; // define
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...