2012-10-06 61 views
2

this问题,我问为什么为什么我们需要extern?

//foo.h 
namespace foo{ 
    int bar; 
} 

给了我一个链接错误,当我包括foo.h在多个文件中。原来我需要extern int bar;来防止错误。为什么我需要extern?我不想在每个想要在多个翻译单元中访问的每个名称空间中的每个变量之前键入extern。为什么int bar;做我所期望的呢?为什么C++标准委员会坚持让我在任何地方输入extern

+3

*声明*和*定义*之间的差异。 – WhozCraig

回答

10

Extern说变量的存储声明将在其他地方进行。链接器会在链接时去找另一个文件中的符号。如果没有外部函数,你告诉编译器,为全局分配一些空间。如果您在多个文件中执行此操作,链接器将会看到同一个符号的多个实例。

+0

我明白了,基本上这里没有捷径。我真的必须在每个变量前输入'extern'吗? – anthropomorphic

+0

这甚至比这更棘手。你需要在头文件中的每个变量前面都有一个extern,但是你需要在你的代码文件中有一个没有extern的相应定义。 – CrazyCasta

+0

我会继续说下去。如果通过在声明中正确地进行外部处理来管理全局变量会成为屁股的一大痛点,那么机会是“extern”不是你的问题;全球各地的洒货商品都是*。 – WhozCraig

3

为什么C++标准委员会坚持让我在任何地方都输入extern ?

它从来没有告诉过写到处....

namespace foo{ 
extern "C++" { 
    int bar; 
    int car; 
    int dar; 
    int xar; 
} 

} 
+1

大声笑,非常真实,+1 ... – 2012-10-06 20:50:52

+0

这就像在每个人之前写入extern一样吗? – anthropomorphic

+0

@MichaelDorst: - 当然......直到你的编译器明白 – perilbrain