2017-09-07 42 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