2015-06-03 4 views
2

Я нашел это: 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-файл.

Спасибо за объяснение (не могу поверить в ошибку компилятора);)

+1

Я не слишком хорошо знаком с C++, но я не думаю, что «extern A const a;» (в x.h) и «extern const A a;» (в main.cpp) - это одно и то же. –

+0

@ColonelThirtyTwo: Почему? –

ответ

4

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