我阅读了一些关于此的文章,并且同时参加了一些C ++入门课程。我正在学习的所有课程和这些文章都无法帮助我了解如何实施extern
和static extern
存储类。在我真正掌握这一点之前,我感觉不舒服,即使我从其他程序员那里看到的是他们不使用这些存储类,但是使用头文件和本地{{1存储类在函数中使用静态变量。我可以做的两个例子。我想出了如何在同一个源文件中使用static
存储类,以及从继承的源文件继承静态变量。
我不断收到链接器和/或编译器错误。
我正在使用带有C ++ 11的Visual Studio 2015社区版,并且使用带有C ++ 98的Android中的CodeDroid。
有人请教我如何在没有链接器和编译器错误的情况下使用static
和extern
存储类吗?
例如,假设我有一个.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
,它有效!
答案 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
的上下文中。编译器仍将编译代码,但由于多重定义错误,链接器将拒绝链接它。