[英]Unresolved symbol error
我正在使用Visual Studio 2012進行“編程原理和實踐”中的練習。嘗試編譯以下源代碼時,出現鏈接器錯誤:
未解析的符號int foo。
我不明白為什么該符號無法解析。
extern int foo;
void print_foo();
void print(int);
#include "my.h"
#include "../../std_lib_facilities.h"
void print_foo()
{
cout<<foo<<'\n';
}
void print(int i)
{
cout<<i<<'\n';
}
#include "my.h"
int main(){
int foo = 7;
print_foo();
print(99);
}
extern int foo;
這是一個聲明 。 它告訴編譯器“在某個地方定義的全局名稱空間中將有一個名為foo
的變量,類型為int
”。
int main(){
int foo = 7;
// ...
}
這在函數main()
內定義了一個int
類型的局部變量foo
,並將其初始化為7。該局部變量在main()
之外不可見。
您實際上沒有在全局名稱空間中定義 foo
。 為此,請將此行恰好添加到my.cpp
或use.cpp
,包括以下內容:
int foo;
這在全局名稱空間中定義了一個名為int
類型的foo
變量。 (作為靜態存儲持續時間的對象,默認情況下, foo
被初始化為零,不過您也可以根據需要提供其他初始化程序。)然后,鏈接器應能夠在以下情況下解析對print_foo()
的全局foo
的print_foo()
您將目標文件鏈接在一起。
重要的是,您只能定義一次foo
,盡管您可以隨意聲明多次。 否則,將違反“一個定義”規則,如果很幸運,則會導致鏈接器錯誤,如果不是,則會導致未定義的行為。
這個說法
extern int foo;
是名稱foo的聲明。 它不是foo的定義。
您必須將此變量初始化為一個定義。 例如
extern int foo = 0;
雖然我在您的代碼中看不到任何意義。
也許您的意思是以下內容。 我認為該變量在模塊中定義,因為如果只有一個模塊,我看不到使用標頭的感覺。
/* my.cpp */
#include "../../std_lib_facilities.h"
extern int foo = 0;
void print_foo();
void print(int);
void print_foo()
{
cout<<foo<<'\n';
}
void print(int i)
{
cout<<i<<'\n';
}
int main(){
extern int foo;
foo = 7;
//...
如果要使用標頭,則代碼可能如下所示
/* my.h */
extern int foo;
void print_foo();
void print(int);
/* my.cpp */
#include "my.h"
#include "../../std_lib_facilities.h"
int foo;
void print_foo()
{
cout<<foo<<'\n';
}
void print(int i)
{
cout<<i<<'\n';
}
/* use.cpp */
#include "my.h"
int main(){
extern int foo;
foo = 7;
print_foo();
print(99);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.