2017-09-07 37 views
2

我通过Bjarne Stroustrup的“编程原理和使用C++编程”学习C++,本章的练习的第一部分是展示使用的.h文件。演练非常简单,我把它跟在信上,但是当我尝试编译时,我总是收到'未定义的foo引用'。我将把这三个文件写在下面,它们超短。与.h文件有关的问题,它似乎没有正确链接

顺便说一句,std_lib_facilities.h是作者包括的.h文件,它包含一些像iostream一样的“包含”,以及'using namespace std;'以及作者写到的一些函数,您需要不时使用

my.h - 包含extern int foo; void print_foo(); void print(int);

#ifndef MY_H 
#define MY_H 

extern int foo; 
void print_foo(); 
void print(int); 

#endif 

my.cpp - 包括my.h限定print_foo()打印使用cout和打印FOO的值(int i)以使用COUT

#include "my.h" 
#include "std_lib_facilities.h" 

void print_foo() 
{ 
    cout << foo << '\n'; 
} 

void print(int i) 
{ 
    cout << i << '\n'; 
} 

使用打印i的值。 CPP - 包括my.h定义main()中foo的值设定为7,并使用print_foo(打印)和使用打印()

#include "my.h" 

int main() 
{ 
    foo = 7; 
    print_foo(); 
    print(99); 
} 

我使用该操作系统是打印的99值Linux如果有帮助

+1

“到foo未定义参考”哪一部分的你不知道?错误信息不能更清晰,你肯定没有在任何地方定义'foo'。 –

+0

“std_lib_facilities.h”大概是一个包含大量包含和“使用命名空间标准”的文件;尽快停止使用它。引入包括你不需要拖慢你的编译器。 '使用名称空间标准'可能会导致意外,并且在头文件中是一个特别糟糕的主意,因为无法将其反转。 – aschepler

回答

2

extern int foo; 

extern意味着,在外面有一个名为intfoo。但这里没有定义。这只是foo的存在声明,这是编译器承诺foo将在需要时存在的承诺。编译器将继续并允许使用foo,即使它不知道foo还在哪里。

这意味着,在cpp文件之一,必须有一个

int foo; 

定义foo,并保持这个承诺。

Documentation on on extern

+0

谢谢!是的,我觉得这是一个非常愚蠢的问题,我只是不确定发生了什么事,因为演习几乎告诉你到底该怎么做。 – Jesus