[英]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
引用了以下事實:變量(或可能的函數)的定義在其他位置; 然后,編譯器將此聲明鏈接到單獨文件中的已定義主體。 前三個關鍵字聲明一個聲明-該變量未在其他位置定義,因此不是prototypes
。
例如,假設您的項目結構如下:
..
-- main.c
-- client.c
-- client.h
-- server.c
-- server.h
當gcc
使用頭文件編譯這些文件時,頭文件通常會define
程序所需的變量。 這將分配一個符號,該符號鏈接到.c文件中的符號declaration
。 這就是編譯器如何使用.o
對象鏈接各種項目文件的方式。 通過使用objdump -d
(假設您在Linux上)調試程序的實際反匯編結構,您可能會對這一切的外觀更感興趣。
祝您好運!
前三個語句實際上為int
分配了一個位置。
最后一個沒有。 它所做的一切告訴編譯器是在另一個編譯單元中的某個地方,將定義一個稱為c
的int
。
如果未定義,稍后會出現鏈接器錯誤。 不足為奇的是,鏈接器會說未定義c
。
前三個是定義,因為它將為變量預留存儲空間。
最后一個不會為int c
分配任何存儲空間。 它將僅使用在其他位置分配和命名的存儲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.