不知道extern为什么不起作用

时间:2018-08-08 20:44:03

标签: c++

我只是测试extern的工作方式(使用MSVC),无论我做什么,我都无法使其工作:

// Test.h
int externalint = 10

// Main.cpp
void main()
{
  extern int externalint;
  std::cout << externalint << std::endl;
  std::cin.ignore();
}

这会导致链接错误,即使我在标头中定义了链接也是如此。我不希望包含标头,因为我阅读标头的方式是说标头可以存在于另一个翻译单元中,而不必包含在内。我的阅读方式是否有误或写错了什么?如果我包含标题,即使没有extern声明,标题也可以正常工作。

3 个答案:

答案 0 :(得分:6)

头文件通常不是翻译单位,而是要包含在其中。这就是为什么标头文件通常不“定义”变量的原因,因为当标头文件包含在不同的翻译单元中时,这将导致多个定义错误(从而一次又一次地重新定义变量)。

这就是“ extern”出现的地方,因为这只是“声明”变量而不“定义”变量。 “ extern”表示“将在其他翻译单元中定义”。

所以通常的方法是:

arg0

答案 1 :(得分:2)

头文件通常不是翻译单位。

将定义放入Test.cpp文件中。

int externalInteger = 10;

将主要功能放入Main.cpp文件中。

#include <iostream>

int main()
{
  extern int externalInteger;
  std::cout << externalInteger << std::endl;
  std::cin.ignore();
}

编译并链接。

g++ -c Test.cpp
g++ -c Main.cpp
g++ Main.o Test.o

对于MS,请使用cl.exe作为编译器,而不要使用g++

答案 2 :(得分:0)

首先问自己,为什么要使用extern这样的东西。然后您将了解如何使用它。 想象一下,您希望在不同的程序中调用一段代码。 一次来自控制台应用程序,一次来自外部程序。

所以您将编写Test.cpp。

现在,您可以使用main()函数在控制台应用程序上使用它,一旦将其与外部程序一起构建,也可以在其中使用它。

两者都将使用externalint值10,只要您在两个项目中都通过git来更新此Test库,就可以使用。在控制台应用程序和外部程序中,您将具有相同的行为。

您问的Test.h在哪里? 你去了:

Test.cpp将与Main.cpp分开编译,但是您想使用Test.cpp中的变量和函数。编译器如何知道其中有什么功能?

您会让他知道。 您只需创建一个接口->Test.h。 然后将其包含在Main.cpp

#include "Test.h"

界面示例:

//Test.h
int externalint = 10;

但是,如果您对此接口感兴趣的还有更多.cpp文件,该怎么办? 然后它将被复制,并且将无法编译。因为您不能两次初始化同一变量。

幸运的是,您可以声明它并宣布将在一个.cpp文件中完成初始化。

// Test.h
extern int externint;
// Test.cpp
int externint = 10;