Общий заголовок вызывает многократную ошибку символа - PullRequest
9 голосов
/ 27 сентября 2011

Рассмотрим следующий пример файла заголовка: shared_example.h

#ifndef SHARED_EX
#define SHARED_EX

const int    Shared_Int     = 1;
const char * Shared_CString = "This is a string";

#endif

Файл shared_example.h включен в несколько блоков компиляции, что приводит компоновщик(правильно) жаловаться, что:

error LNK2005: "char const * const Shared_CString" (?Shared_CString@@3PBDB) already defined in First_Compilation_Unit.obj

Удаление константы Shared_CString из этого файла устраняет проблему.

Итак, у меня два вопроса.

Во-первых, почему константа Shared_Int не вызывает одну и ту же проблему?

Во-вторых, как можно разрешить отдельным модулям компиляции использовать одно и то же строковое значение константы?

Ответы [ 3 ]

16 голосов
/ 27 сентября 2011

Первое объявление имеет постоянное целочисленное значение.В C ++ const имеет внутреннюю связь по умолчанию.

Второе объявление имеет указатель на const char.Это объявление не const само по себе и не имеет других спецификаторов связи, поэтому оно не имеет внутренней связи.Если вы измените объявление на const char * const, оно станет постоянным указателем на const char и будет иметь внутреннюю связь.

4 голосов
/ 27 сентября 2011

shared_example.h

#ifndef SHARED_EX
#define SHARED_EX

extern const int    Shared_Int;
extern const char * Shared_CString;

#endif

shared_example.c

const int    Shared_Int     = 1;
const char * Shared_CString = "This is a string";
1 голос
/ 27 сентября 2011

Если сделать их статичными, это решит проблему. Вы не видите Shared_Int, потому что вы не используете его более чем в одном из скомпилированных модулей.

Edit: My bad - то, что я говорю, действительно для C. Не видел тега c ++. К сожалению

...