对 C++11 中的 'extern' 和 'static extern' 存储 类 感到困惑
Confused about 'extern' and 'static extern' storage classes in C++11
我阅读了几篇有关此的文章,并且正在同时学习一些 C++ 入门课程。我正在学习的所有课程和这些文章都无法帮助我理解如何实现 extern
和 static extern
存储 class。在我真正掌握了这一点之前,我不会继续前进,尽管我从其他程序员那里看到的是他们不使用这些存储 classes,而是使用头文件和本地的继承static
存储class 在函数中使用静态变量。这两种情况我都能做到。我想出了如何在同一个源文件中使用 static
存储 class 以及从继承的源文件继承静态变量。
我不断收到链接器和/或编译器错误。
我正在使用带有 C++11 的 Visual Studio 2015 Community Edition,并且在带有 C++98 的 Android 中使用 CodeDroid。
有人能教我如何在没有链接器和编译器错误的情况下使用 extern
和 static extern
存储 classes 吗?
例如,假设我有 one.cpp 和 two.cpp。假设我在 one.cpp 中有一个 int main()
函数。假设我想演示在 main()
函数中输出 extern
int 的值。并且,假设我有一个名为 extFuncExample()
的 void 函数在 one.cpp 中声明和定义,并且还想在那里输出它的值。
我正在学习的课程有 extern
和 static 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 它。
我阅读了几篇有关此的文章,并且正在同时学习一些 C++ 入门课程。我正在学习的所有课程和这些文章都无法帮助我理解如何实现 extern
和 static extern
存储 class。在我真正掌握了这一点之前,我不会继续前进,尽管我从其他程序员那里看到的是他们不使用这些存储 classes,而是使用头文件和本地的继承static
存储class 在函数中使用静态变量。这两种情况我都能做到。我想出了如何在同一个源文件中使用 static
存储 class 以及从继承的源文件继承静态变量。
我不断收到链接器和/或编译器错误。
我正在使用带有 C++11 的 Visual Studio 2015 Community Edition,并且在带有 C++98 的 Android 中使用 CodeDroid。
有人能教我如何在没有链接器和编译器错误的情况下使用 extern
和 static extern
存储 classes 吗?
例如,假设我有 one.cpp 和 two.cpp。假设我在 one.cpp 中有一个 int main()
函数。假设我想演示在 main()
函数中输出 extern
int 的值。并且,假设我有一个名为 extFuncExample()
的 void 函数在 one.cpp 中声明和定义,并且还想在那里输出它的值。
我正在学习的课程有 extern
和 static 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 它。