困惑于' extern'和静态外部' C ++ 11

时间:2017-03-28 05:32:54

标签: c++ c++11 extern

我阅读了一些关于此的文章,并且同时参加了一些C ++入门课程。我正在学习的所有课程和这些文章都无法帮助我了解如何实施externstatic extern存储类。在我真正掌握这一点之前,我感觉不舒服,即使我从其他程序员那里看到的是他们不使用这些存储类,但是使用头文件和本地{{1存储类在函数中使用静态变量。我可以做的两个例子。我想出了如何在同一个源文件中使用static存储类,以及从继承的源文件继承静态变量。

我不断收到链接器和/或编译器错误。

我正在使用带有C ++ 11的Visual Studio 2015社区版,并且使用带有C ++ 98的Android中的CodeDroid。

有人请教我如何在没有链接器和编译器错误的情况下使用staticextern存储类吗?

例如,假设我有一个.cpp和两个.pp。假设我在one.cpp中有一个static extern函数。假设我想演示在int main()函数中输出extern int的值。并且,假设我在one.cpp中声明并定义了一个名为main()的void函数,并且还想在那里输出它的值。

我正在学习的课程有extFuncExample()extern作为两个不同的存储类。所以,如果你愿意将它分解为我,那么我可以在没有编译器和链接器错误的情况下输出这些值。

非常感谢你!

one.cpp

static extern

two.cpp

    #include <iostream>
    #include "Two.cpp"


    int main()
    {
        extern int global_int;
        std::cout << "global_int = " << global_int << '\n';

        return 0;
    }

这,我找到了作品。我将 #include <iostream> int global_int = 100; 包含在one.cpp中,并使用导致问题的#include "two.cpp"存储类。删除了extern,它有效!

1 个答案:

答案 0 :(得分:1)

在C和C ++中,(转发)声明和符号定义之间存在差异。 extern用于转发声明存在转换单元外部的符号,即:从“某处”“导入”符号并使“使其可见”到正在编译的代码。在链接时,对external符号的引用已得到解决。

有效地extern是一种指示编译器/工具链不应该期望在正在编译的代码中找到符号定义的方法,而是应该查看链接的库来查找它。对于未声明为extern的符号,链接器不会这么做。

除此之外,人们用extern做出了一些常见的错误:使用它来声明一个全局变量并在头部内定义它。例如:

// some header.h
extern int my_global = 40; // = 40 makes this wrong.

然后他们继续在不同的翻译单元(源文件)中多次包含它:

// file1.c{pp}
#include "header.h"

// file2.c{pp}
#include "header.h"

此时,您已在程序中为同一符号引入了多个定义,因为#include只是将标题的内容逐字复制到执行#include的上下文中。编译器仍将编译代码,但由于多重定义错误,链接器将拒绝链接它。