簡體   English   中英

未解決的符號錯誤

[英]Unresolved symbol error

我正在使用Visual Studio 2012進行“編程原理和實踐”中的練習。嘗試編譯以下源代碼時,出現鏈接器錯誤:

未解析的符號int foo。

我不明白為什么該符號無法解析。

我的

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

my.cpp

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

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

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

use.cpp

#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.cppuse.cpp ,包括以下內容:

int foo;

這在全局名稱空間中定義了一個名為int類型的foo變量。 (作為靜態存儲持續時間的對象,默認情況下, foo被初始化為零,不過您也可以根據需要提供其他初始化程序。)然后,鏈接器應能夠在以下情況下解析對print_foo()的全局fooprint_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM