是否有可能在未包含在任何其他文件中的文件中使用extern变量?

时间:2012-10-09 16:27:22

标签: c++ c storage-class-specifier

我在网上遇到过很多在main.c中有extern int x的例子,其主要功能在于。

我知道的extern的唯一用途是在另一个文件中声明,并在定义之后在另一个文件中使用它。

喜欢: a.h:extern int x;

a.c:int x = 5;

main.c: #include "a.h" // and start using x

第一种情况对我来说似乎是多余的。

所以, 是否有可能在未包含在任何其他文件中的文件中使用extern变量?

4 个答案:

答案 0 :(得分:2)

extern告诉编译器x存在于不同的模块中,应该从其他地方链接。直接将它放在main.c中就可以避免引入标题(无论如何都会包含在内)

就像在标题中一样,x仍然需要存在于另一个.c模块中,其中不是定义extern

答案 1 :(得分:2)

extern变量基本上有两个函数,一个是在另一个文件中使用变量,另一个是访问全局变量,如下面的代码所示。

int x=10;
int main()
{
     int x=20;
     cout<<x;             //refers to x=20
     if(x==20)
     {
            extern int x;
            cout<<x;      //refers to the global x that is x=10
     }
 }

答案 2 :(得分:1)

当然。在文件中使用extern可以在那个文件中使用该变量。它不必包含在其他任何地方。

答案 3 :(得分:0)

使用extern会导致对象具有外部链接;至 使用对象(而不是值或类型)实例化模板, 对象必须具有外部链接(至少在C ++ 03中)。大多数对象 在命名空间范围内定义的是全局链接,但const对象没有。 所以你有类似的东西:

template <char const* n>
class Toto { /* ... */ };

char const n1[] = "abc";
Toto<n1> t1;    //  Illegal...

extern char const n2[] = "xyz";
Toto<n2> t2;    //  Legal...

这是一种特殊情况,但它导致我(一次或两次)使用 extern在源文件中的未命名命名空间中。