2017-01-24 2 views
0

Я больше в JAVA, но когда HI-Perf находится в списке требований, C/C++ должен появиться на столе. И так оно и было. И, как и ожидалось, я наткнулся на то, что я не могу понять, и не могу разобраться в SO. Так может ли кто-нибудь объяснить мне, почему не опекун в заголовке ниже работает?cpp - почему защитник не защитил меня от нескольких определений?

// a0a.h 

#ifndef _A0A 
#define _A0A 

class State { 
public: 
    static State* A; 
} 

State* State::A = new State(); /* this is going to be troublesome */ 

#endif 

.

B.h // #include "a0a.h" 
C.h // #include "a0a.h" 

XXX.h // #include "B.h" 
XXX.h // #include "C.h" 

и компиляция дает мне ошибку с несколькими определениями в указанной выше строке.

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

Надеюсь, мне не нужно говорить, что это всего лишь фиктивный код, отражающий то, что я сделал, а не тот код, который я писал.

EDIT

Repeated Multiple Definition Errors from including same header in multiple cpps не объясняет, почему. Я имею в виду, что я не получаю картину из любого из этих ответов - они просто дают предложения (ни один из которых мне не нужен).

Конечно, я могу погрузиться в книги и, возможно, узнаю, как все это заставляет компилятор чихать в моей консоли, но спрашивать, ТАК, намного быстрее и, скорее всего, поможет кому-то еще понять.

+2

Статичность должна быть определена в файле реализации (* .cpp). – ZDF

+2

*** Почему защитник не защитил меня от нескольких определений? *** Поскольку защитник include предотвращает множественное включение в одну и ту же единицу перевода (исходный файл cpp). – drescherjm

+0

У вас есть только один .cpp-файл, в который вы включаете свои приложения? – marcinj

ответ

0
  1. «Охранник» избегает несколько включений в же файла.
  2. Каждый раз, когда вы включаете заголовок, включено определение State::A. Если вы включили несколько раз, у вас будет несколько определений для State::A, что не является законным: компоновщик выдаст ошибки. Чтобы этого избежать, определите State::A в файле реализации (* .cpp).
+0

Не компилятор. – SergeyA

+0

@SergeyA Да, извините. – ZDF

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