簡體   English   中英

為什么使用“ extern”創建變量是聲明而不是定義?

[英]Why is creating a variable using 'extern' a declaration and not a definition?

我在閱讀時遇到以下問題...只是無法理解其背后的邏輯。

auto int c;
static int c;
register int c;
extern int c;

給出的前三個是定義,最后一個是聲明..怎么來的?

最后一個帶有extern沒有定義c存儲。 它僅表示c存在於某個位置,並且鏈接程序應該能夠將其解析為在其他位置定義的某些全局c

如果編譯並鏈接了一個.c文件,並嘗試使用最后一個c ,則將出現鏈接器錯誤。 對於前3個c您將不會在當前編譯單元中擁有它們的實質(它們已定義 )。

如果您想了解有關extern和聲明與定義的更多信息,這是一篇有關該主題的好文章 引用該文章:

聲明變量/函數僅聲明變量/函數存在於程序中的某個位置,但未為其分配內存

關鍵字extern引用了以下事實:變量(或可能的函數)的定義在其他位置; 然后,編譯器將此聲明鏈接到單獨文件中的已定義主體。 前三個關鍵字聲明一個聲明-該變量未在其他位置定義,因此不是prototypes

例如,假設您的項目結構如下:

..
-- main.c
-- client.c
-- client.h
-- server.c
-- server.h

gcc使用頭文件編譯這些文件時,頭文件通常會define程序所需的變量。 這將分配一個符號,該符號鏈接到.c文件中的符號declaration 這就是編譯器如何使用.o對象鏈接各種項目文件的方式。 通過使用objdump -d (假設您在Linux上)調試程序的實際反匯編結構,您可能會對這一切的外觀更感興趣。

祝您好運!

前三個語句實際上為int分配了一個位置。

最后一個沒有。 它所做的一切告訴編譯器是在另一個編譯單元中的某個地方,將定義一個稱為cint

如果未定義,稍后會出現鏈接器錯誤。 不足為奇的是,鏈接器會說未定義c

四個句子是聲明,但是前三個句子也是定義。

在這里閱讀有關聲明和定義之間的區別。

autostaticregister是該變量的修飾符。 閱讀有關它們的文檔。

extern只是聲明,因為您要告訴編譯器變量或函數的定義在其他C模塊中的其他位置。

希望能幫助到你!

前三個是定義,因為它將為變量預留存儲空間。

最后一個不會為int c分配任何存儲空間。 它將僅使用在其他位置分配和命名的存儲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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