2015-04-26 2 views
0

Рассмотрите этот код.Статическая ошибка переменной ссылки, C++

//header.h 
int x; 

//otherSource.cpp 
#include "header.h" 

//main.cpp 
#include "header.h" 
... 
int main() 
{ 

} 

В этом случае компилятор ошибся с сообщением. «фатальная ошибка LNK1169: обнаружен один или несколько найденных множимых символов»

, но когда я добавляю статику до x, она компилируется без ошибок.

И вот второй случай.

//header.h 

class A 
{ 
public: 
    void f(){} 
    static int a; 
}; 

int A::a = 0; 

/otherSource.cpp 
#include "header.h" 

//main.cpp 
#include "header.h" 
... 
int main() 
{ 

} 

В этом случае компилятор снова ошибается с несколькими объявлениями.

Может ли кто-нибудь объяснить мне поведение, которое мы статические переменные в классах и глобальных декларациях? Заранее спасибо.

+0

Определение (где вы инициализируете статический variabe) должно быть в одном * и только в одном исходном файле. Не помещайте его в файл заголовка. – PaulMcKenzie

ответ

2

Проблема со статической переменной-члена является то, что у вас есть определение происходит в файле заголовка. Если у вас есть файл в нескольких исходных файлах, у вас есть несколько определений статической переменной-члена.

Чтобы это исправить, заголовочный файл должен состоять только из этого:

#ifndef HEADER_H 
#define HEADER_H 
// In the header file 
class A 
{ 
public: 
    void f(){} 
    static int a; 
}; 
#endif 

Определение статической переменной a должны находиться в одном и только один модуль. Очевидное место для этого - в вашем main.cpp.

#include "header.h" 
int A::a = 0; // defined here 
int main() 
{ 
} 
0

Объявить x, как extern в header.h, чтобы сообщить компилятору, что x будет определена где-то еще:

extern int x; 

Затем определить xраз в исходном файле, который вы считаете наиболее подходящим.
Например, в otherSource.cpp:

int x = some_initial_value; 
Смежные вопросы