Включение нескольких переменных указателя заголовка c ++ - PullRequest
0 голосов
/ 18 марта 2012

Я столкнулся с такой проблемой:

У меня есть один заголовочный файл:

//first variant:  
#ifndef LIBRARIES_H
#define LIBRARIES_H
 const char a='4';    
 #endif // LIBRARIES_H

Я включаю его в несколько файлов .cpp. Все отлично работает.

Но вдруг, если я объявлю указатель:

//second variant:
#ifndef LIBRARIES_H
  #define LIBRARIES_H
 const char *a="asdfgh";
 #endif // LIBRARIES_H

пожалуйста, обратите внимание, Я ОБЪЯВЛЯЮ ТОЛЬКО ОДИН из них (из вариантов).
Я ОБЪЯВЛЯЮ только один раз (я пытался изменить имя на sadfgh или asdfg).

Когда я пробую второй вариант, я удаляю первый и наоборот.

Если я объявлю указатель на строку, я получу ошибку «множественное включение переменной». Я скомпилирую его, используя qt. Я удалял и перекомпилировал проект уже несколько раз. enter image description here

Конечно, я могу определить это в функции main (), но мне интересно, что является причиной этой проблемы? Почему я не могу объявить указатель в заголовочном файле и впоследствии включить его в несколько файлов исходного кода?

Ответы [ 3 ]

5 голосов
/ 19 марта 2012
const char a='4';

означает

char const a = '4';

, который можно прочитать в обратном направлении, так как & ldquo; 4 является начальным значением для a, которое является константой char & rdquo;.

Поскольку это a является константой, оно имеет внутреннюю связь (т. Е. Оно не подвергается воздействию других единиц перевода).

С другой стороны,

const char *a="asdfgh";

означает

char const * a = "asdfgh";

, который вы можете прочитать назад как & ldquo; "asdfgh" - это массив, используемый для инициализации a, который является указателем на константу char & rdquo;.

В этом случае a само по себе не является const, и поэтому не получает внутреннюю связь по умолчанию: она имеет внешнюю связь .

Когда вы включаете свой заголовок в две или более единиц перевода, вы, следовательно, получаете два или более глобальных и различных объекта, называемых a, что нарушает Правило единого определения C ++ (на него часто ссылаются) как просто ODR ).

Одно из лекарств - сделать a само по себе const,

char const * const a = "asdfgh";

Теперь попробуйте прочитать , что в обратном направлении, чтобы понять это.

3 голосов
/ 18 марта 2012

Edit2 Очевидно, мое предыдущее предложение об изменении

const char* a = "asdfgh"

на

const char[6] a= "asdfgh"

работает.

Я все еще в этом разбираюсь, но когда вы объявляете указатель, вы просто говорите, что этот указатель постоянен, а не память, на которую он указывает.Когда вы объявляете массив, вы говорите, что данные за константой также неизменны.Я углубляюсь в это.

Edit3: Второй абзац этого объясняет, что происходит.

Кроме того, ответ "Приветствия" объясняет это хорошо.1017 *

0 голосов
/ 19 марта 2012

Приветствие лучше моего, но ...

Попробуйте изменить объявление на:

extern const char * const a;

и затем в одном из ваших файлов cpp, скажите:

const char * a = "asdf";

(хотя, если у вас есть оба конста,

const char * const a = "asdf";

должно работать).

Вы не получите статическую связь, если у вас нет обоих констант. Так что, если вы используете оба конца, он должен работать, как внешний, так и статический.

...