困惑于';外部';和';静态外部';C+中的存储类+;11 我读了几篇关于这方面的文章,同时还带了几门C++入门课。我正在学习的所有课程和这些文章都不能帮助我理解如何实现extern和静态extern存储类。在我真正掌握这一点之前,我不会感到舒服,尽管我从其他程序员那里看到的是,他们不使用这些存储类,而是使用头文件继承和本地staticstorage类在函数中使用静态变量。这两种情况我都能做到。我了解了如何在同一个源文件中使用static存储类,以及如何从继承的源文件继承静态变量

困惑于';外部';和';静态外部';C+中的存储类+;11 我读了几篇关于这方面的文章,同时还带了几门C++入门课。我正在学习的所有课程和这些文章都不能帮助我理解如何实现extern和静态extern存储类。在我真正掌握这一点之前,我不会感到舒服,尽管我从其他程序员那里看到的是,他们不使用这些存储类,而是使用头文件继承和本地staticstorage类在函数中使用静态变量。这两种情况我都能做到。我了解了如何在同一个源文件中使用static存储类,以及如何从继承的源文件继承静态变量,c++,c++11,extern,C++,C++11,Extern,我不断收到链接器和/或编译器错误 我使用C++11的Visual Studio 2015社区版,并使用C++98的Android中的CodeDroid 有人能教我如何使用extern和静态extern存储类而不出现链接器和编译器错误吗 例如,假设我有一个.cpp和两个.cpp。假设我在one.cpp中有一个int main()函数。假设我想演示在main()函数中输出externint的值。假设我在one.cpp中声明并定义了一个名为extFuncExample()的void函数,并希望在那里输

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

我使用C++11的Visual Studio 2015社区版,并使用C++98的Android中的CodeDroid

有人能教我如何使用
extern
静态extern
存储类而不出现链接器和编译器错误吗

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

我正在学习的一门课程将
extern
static extern
作为两个不同的存储类。所以,如果你能把这个分解给我,我就可以输出这些值,而不会出现编译器和链接器错误

非常感谢你

1.cpp

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


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

        return 0;
    }
#包括
#包括“两个.cpp”
int main()
{
外部集成全局集成;

ST::C和C++中的CUT< P>在符号(向前)声明和符号定义上有区别。<代码> ExtXu/<代码>用来向前声明翻译单元外部的符号的存在,即:从某处导入“符号”并使其可见。到正在编译的代码。在链接时,
外部
符号的引用被解析

实际上,
extern
是一种指示编译器/工具链不应期望在正在编译的代码中找到符号定义的方法,而应在链接的库中查找符号定义。对于未声明的符号,
extern
,链接器不会费心这么做

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

// some header.h
extern int my_global = 40; // = 40 makes this wrong.
然后,他们继续在不同的翻译单元(源文件)中多次包含它:


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

既然您同时提到了
静态
外部
,我想您的意思是在全局范围内(而不是在类或函数内)?也许你可以给我们展示一个给你带来错误的代码示例,最好是一个?然后请展示你得到的实际错误。没有
静态外部
存储类。@n.m那么这门课需要扔进垃圾桶了,哈哈Thanks@host_255是的,是的。@Someprogrammerdude好吧,我做了一些我以前没有做过的事情,因为不是故意向我解释的,但现在有了意义。我在“one.cpp”中包含“two.cpp”,并在“two.cpp”中定义它,在“one.cpp”的
int main()
中声明它,然后输出它。因此,我得到了LNK2005和LNK1169。这一次,我删除了
\include“two.cpp”
链接器错误消失了。我认为这是因为包括“two.cpp”as和使用
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"