我只是测试extern的工作方式(使用MSVC),无论我做什么,我都无法使其工作:
// Test.h
int externalint = 10
// Main.cpp
void main()
{
extern int externalint;
std::cout << externalint << std::endl;
std::cin.ignore();
}
这会导致链接错误,即使我在标头中定义了链接也是如此。我不希望包含标头,因为我阅读标头的方式是说标头可以存在于另一个翻译单元中,而不必包含在内。我的阅读方式是否有误或写错了什么?如果我包含标题,即使没有extern声明,标题也可以正常工作。
答案 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;