无法找到对外部变量的未定义引用 (dev c++)

Can't locate the undefined reference to an extern variable (dev c++)

(说得太简单了还请见谅,我简直瞎了眼)

main.cpp:

#include "a.h"

int main()
{
    x = 4 ;
}

a.h:

extern int x ;

(出于某种原因,这段代码在第一次编译时有效,但在第二次编译时无效。

附带问题: 有时我会遇到问题,需要将代码编译两次才能正常工作。我有编译器问题吗?)

如您所知,构建 C 或 C++ 程序涉及三个步骤:预处理、编译和链接。这是对所发生情况的简单、非技术性描述。

  1. 预处理

preprocessor 将用文件 a.h 的逐字内容替换 #include "a.h"。这导致

extern int x;

int main()
{
    x = 4;
}
  1. 正在编译

编译器处理预处理器的输出。 extern int x; 只是一个 声明,不是定义 。它告诉编译器它可以相信其他地方 space 是为int 类型的名为x 的变量保留的。 (extern x表示x有所谓的external linkage。)编译器生成代码将此变量设置为4,但标记代码要求链接器填写实际位置x 一旦链接器确定了它的定义位置。

  1. 正在链接

链接器处理上一步编译器生成的目标文件。它查找 x 的实际定义,但找到 none(x 仅声明但从未定义)并发出未定义的符号错误。

如果您想查看 extern 的实际效果,只需创建第三个文件,例如 b.cpp:

// b.cpp
int x;

如果您现在构建由 main.cpp b.cpp 组成的程序,链接器错误将消失。 b.cpp 定义了 x,因此链接器将选取此定义并在由 main.cpp 编译生成的占位符代码中填充 x 的位置,并将其设置为 4。

至于附带的问题:我认为您的编译有时成功有时不成功的问题很可能是由于操作员的一些错误:-)