множественная ошибка определения для статических членов класса const

Недавно я столкнулся с проблемой, описанной в странных неопределенных символов статические константы внутри структуры/класса, и я пытаюсь привести свой код в соответствие, добавляя определения в соответствующие файлы .cpp для всех членов моего класса static const, а не только тех, которые вызывали ошибки компоновщика.

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

Перемещение инициализаторов в определения предотвращает ошибки, но я бы не стал этого делать.

Что бы это ни стоило, хотя я сейчас работаю в Visual Studio, этот код должен быть построен на нескольких платформах.


person IronMensan    schedule 05.05.2011    source источник
comment
Можете ли вы показать нам свой код?   -  person wkl    schedule 05.05.2011
comment
Чтобы добавить к тому, что сказал @birryree, сократите свой код до наименьшего полного примера, который все еще демонстрирует вашу проблему. Сокращая свой код, вы либо обнаружите проблему (и мы вам не понадобимся), либо упростите нам ее выявление (и вы получите ответ раньше). короткие, автономные полные примеры программ, см. sscce.org.   -  person Robᵩ    schedule 05.05.2011
comment
@birryree и @Rob - код существенно не отличается от того, что находится в связанных вопросах и ответах.   -  person IronMensan    schedule 05.05.2011
comment
если он существенно не отличается от связанного вопроса, то у вас не будет этой проблемы из-за совета. Поскольку вы спрашиваете, вам, вероятно, следует показать нам свой код, чтобы мы могли указать, что не так.   -  person wkl    schedule 05.05.2011
comment
@birryree Проблема была связана с языковыми расширениями Visual Studio (см. ответ Lindydancer), поэтому в связанном вопросе это не было проблемой.   -  person IronMensan    schedule 05.05.2011


Ответы (4)


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

Попробуйте отключить языковые расширения.

person Lindydancer    schedule 05.05.2011
comment
Отключение языковых расширений недопустимо, поскольку Windows7 SDK не компилируется без них. Однако параметр selectany, описанный в msdn.microsoft.com /en-us/library/34h23df8(v=VS.80).aspx, похоже, помогает. - person IronMensan; 05.05.2011

Статические переменные-члены объявляются в теле класса и определяются один раз вне тела класса. Общий способ сделать это:

class MyClass

{
    static int i;

};

int MyClass::i = 0;

Определение выполняется в исходных файлах C++, а не в заголовке (.h). Если это сделать, переменная будет определена везде, где заголовочный файл включен. Похоже, вы столкнулись с той же проблемой.

person Alok Save    schedule 05.05.2011
comment
Я попытался дать понять в вопросе, что это не проблема, включив соответствующий .cpp, а определение находится только в одном из блоков компиляции. - person IronMensan; 05.05.2011

Согласно одному из сообщений на http://bytes.com/topic/c/answers/710704-const-static-initialization-visual-studio на самом деле это может быть ошибка Visual Studio, не позволяющая вам использовать эту форму инициализации.

К сожалению, я думаю, что вы можете застрять, выполняя инициализацию в исходном файле, чтобы сохранить переносимость.

Я создал простой пример, который отлично скомпилировался и линковался в g++ 4.2.

person Mark B    schedule 05.05.2011
comment
Знаете ли вы, исправлено ли это в более поздних версиях Visual Studio? Я до сих пор использую 2005. - person IronMensan; 05.05.2011

Я думаю, если вы хотите, чтобы ваш код работал на нескольких платформах, вам следует перенести инициализацию в определение (в файле .cpp). Хотя он может работать иначе на одном или нескольких компиляторах, не полагайтесь на его переносимость.

person Axel    schedule 05.05.2011