为什么使用'extern'声明而不是定义来创建变量?

时间:2012-07-16 15:26:07

标签: c declaration definition

我在阅读时遇到了以下问题......只是无法得到这背后的逻辑。

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

给出前三个是定义,最后一个是声明..是来吗?

5 个答案:

答案 0 :(得分:2)

extern的最后一个未定义c的存储空间。它只表示c存在于某处,链接器应该能够将其解析为其他地方定义的全局c

如果您编译并链接了单个.c文件并尝试使用最后一个c,则会出现链接器错误。对于前3个c,你不会因为它们在当前的编译单元中有实质内容(它们已经定义)。

如果您想了解有关extern和声明与定义的更多信息,请参阅此主题的good article。引用那篇文章:

  

变量/函数的声明只是声明变量/函数存在于程序中的某处但是没有为它们分配内存

答案 1 :(得分:1)

关键字extern引用了变量(或可能是函数)的定义在别处的事实;然后,编译器将此声明链接到单独文件中的已定义主体。前三个关键字表示一个声明 - 该变量未在其他地方定义,因此不是prototypes

例如,假设您有一个类似的项目结构:

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

gcc使用头文件编译它们时,头文件通常会define程序所需的变量。这将分配一个链接到.c文件中符号的declaration的符号。这是编译器将各种项目文件与.o对象链接的方式。通过使用objdump -d(假设您使用的是Linux)来调试程序的实际反汇编结构,您可能会对如何显示这一切感兴趣。

享受并祝你好运!

答案 2 :(得分:1)

前3个语句实际上为int分配了一个位置。

最后一个没有。所有它告诉编译器是在另一个编译单元的某个地方,将定义一个名为int的{​​{1}}。

如果未定义,稍后您将收到链接器错误。不足为奇的是,链接器会说c未定义。

答案 3 :(得分:1)

这四个句子是声明,但前三个句子也是定义。

阅读here关于声明和定义之间的区别。

autostaticregister 是变量的修饰符。阅读有关它们的文档。

extern只是声明,因为你告诉编译器变量或函数的定义在其他地方 - 在另一个C模块中 - 。

希望它有所帮助!

答案 4 :(得分:1)

前三个是定义,因为它会为变量留出存储空间。

最后一个不会为int c分配任何存储空间。它只会使用已在其他地方分配和命名的存储空间。