Я нашел это: How do I use extern to share variables between source files? и его главный ответ для меня довольно ясный.Зачем нужен файл include для внешних переменных?
Однако я не понимаю, почему это дает мне ошибку:
хк:
#pragma once
namespace x {
class A {
public: void func() const;
};
// extern A const a; // cannot move this out of the include file !!!
// extern int xi; // fine to remove from here
}
--- main.cpp ---
#include "stdafx.h"
#include "x.h"
namespace x { extern int xi; extern const A a ; } // instead of include file
extern int i;
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << i << std::endl; // works
std::cout << x::xi << std::endl; // works
x::a.func();
return 0;
}
--- х. cpp ---
#include "stdafx.h"
#include "x.h"
namespace x
{
void A::func() const
{ std::cout << "x::A::func() called" << std::endl; }
const A a; // Problem if const
int xi = 234; // works
}
int i = 123; // works
ошибка LNK2001: un разрешенный внешний символ "class x :: A const x :: a" (? a @ x @@ 3VA @ 1 @ B)
(VisualStudio 2013) Компиляция двух файлов в порядке, и я могу создать и запустить его, если Я удаляю ключевое слово const или перемещаю оператор extern в include-файл.
Спасибо за объяснение (не могу поверить в ошибку компилятора);)
Я не слишком хорошо знаком с C++, но я не думаю, что «extern A const a;» (в x.h) и «extern const A a;» (в main.cpp) - это одно и то же. –
@ColonelThirtyTwo: Почему? –