2015-10-25 19 views
1

(道歉,如果它是简单,我只是失明。)无法找到未定义的引用与外部变量(DEV C++)

main.cpp中:

#include "a.h" 

int main() 
{ 
    x = 4 ; 
} 

啊:

extern int x ; 

(出于某种原因,第一编译这段代码工作,但不是第二个

旁边的问题:偶尔我遇到问题,我需要编译两次代码才能工作。我是否有编译器问题?)

回答

1

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

  1. 预处理

preprocessor将取代#include "a.h"与回历文件的内容逐字这导致

extern int x; 

int main() 
{ 
    x = 4; 
} 
  • 编译
  • 编译器处理该预处理器的输出。 extern int x;仅为声明,而不是定义。它告诉编译器它可以相信空间被保留用于x类型的变量int。 (extern x表示x有所谓的external linkage。)编译器生成的代码将此变量设置为4,但标记代码以在链接器确定其定义的位置时要求链接器填写实际位置x

  • 链接
  • 接头处理由在前面的步骤中的编译器生成的目标文件。它寻找x的实际定义,但找不到(x仅被声明但从未定义),并发出未定义的符号错误。

    如果你想看到extern在行动上,只需创建一个第三个文件,说b.cpp

    // b.cpp 
    int x; 
    

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

    至于方面的问题:我认为你的问题编译有时成功,有时不成功可能是由于操作员的部分错误:-)