对 C++11 中的 'extern' 和 'static extern' 存储 类 感到困惑

Confused about 'extern' and 'static extern' storage classes in C++11

我阅读了几篇有关此的文章,并且正在同时学习一些 C++ 入门课程。我正在学习的所有课程和这些文章都无法帮助我理解如何实现 externstatic extern 存储 class。在我真正掌握了这一点之前,我不会继续前进,尽管我从其他程序员那里看到的是他们不使用这些存储 classes,而是使用头文件和本地的继承static 存储class 在函数中使用静态变量。这两种情况我都能做到。我想出了如何在同一个源文件中使用 static 存储 class 以及从继承的源文件继承静态变量。

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

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

有人能教我如何在没有链接器和编译器错误的情况下使用 externstatic extern 存储 classes 吗?

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

我正在学习的课程有 externstatic extern 作为两个不同的存储 class。所以,如果你愿意把它分解给我,这样我就可以在没有编译器和链接器错误的情况下输出这些值。

非常感谢!

one.cpp

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


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

        return 0;
    }

two.cpp

    #include <iostream>

    int global_int = 100;

这个,我找到作品了。我在 one.cpp 中包含了 #include "two.cpp" 并且还使用了导致问题的 extern 存储 class。删除了 #include "two.cpp" 并且成功了!

在 C 和 C++ 中,(向前)声明和符号定义之间存在差异。 extern 用于转发声明翻译单元外部符号的存在,即:从 "somewhere" 到 'import' 符号和 "make it visible" 到正在编译的代码.在 link 时,对 external 符号的引用被解析。

实际上 extern 是一种指示 compiler/toolchain 它不应该期望在正在编译的代码中找到符号定义的方法,而是应该在库中查找 link反对找到它。 linker 不会为未声明的符号这样做 extern.

除此之外,人们在使用 extern 时会犯一个常见的错误:用它来声明全局变量并在 header 中定义它。例如:

// 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 只是将 header 的内容逐字复制到 #include 所在的上下文中执行。编译器仍然会编译代码,但是 linker 会因为多重定义错误而拒绝 link 它。