我在阅读时遇到了以下问题......只是无法得到这背后的逻辑。
auto int c;
static int c;
register int c;
extern int c;
给出前三个是定义,最后一个是声明..是来吗?
答案 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关于声明和定义之间的区别。
auto,static和register 是变量的修饰符。阅读有关它们的文档。
extern只是声明,因为你告诉编译器变量或函数的定义在其他地方 - 在另一个C
模块中 - 。
希望它有所帮助!
答案 4 :(得分:1)
前三个是定义,因为它会为变量留出存储空间。
最后一个不会为int c
分配任何存储空间。它只会使用已在其他地方分配和命名的存储空间。