为何这段未正确定义int main()的C语言代码仍能正常运行?
为什么这段不符合常规语法的C语言代码能正常运行?
首先先把问题里的代码贴出来,方便大家理解:
#include <stdio.h> int main() struct books { char title[50]; char author[50]; char sub[100]; int b_id; }; //此处本该使用int main(),但代码仍能正常运行,这是为什么? { struct books b1={"48lop","rg","sh",288017}; printf("%s\n",b1.title); printf("%s\n",b1.author); printf("%s\n",b1.sub); printf("%d",b1.b_id); return 0; }
编译器的实际解读
你可能觉得这段代码结构混乱,但在遵循C89(ANSI C)标准的编译器眼里,它是被这样拆解的:
- 首先包含
stdio.h头文件,这部分完全合规 - 第二行的
int main()会被当作函数原型声明——告诉编译器:“存在一个返回int类型的main函数”,因为它后面没有紧跟函数体({}),所以不会被识别为函数定义 - 接下来的
struct books定义是全局作用域的合法代码,没有任何问题 - 最后的
{ ... }部分,被编译器识别为main函数的定义。在C89标准里,函数定义如果省略了返回类型,编译器会默认它返回int类型,刚好和前面的int main()声明匹配,所以整个函数的类型是一致的,能正常编译运行
现代C标准下的情况
这种写法在C99及之后的标准里是完全不合法的:
- C99强制要求所有函数定义必须显式指定返回类型,再也不能依赖默认
int的规则 - 同时,
main函数的声明和定义有更严格的语法要求,这种拆分式的写法会被编译器直接报错
规范的写法
实际开发中一定要遵循现代C标准,把代码改成正常的结构:
#include <stdio.h> struct books { char title[50]; char author[50]; char sub[100]; int b_id; }; int main() { struct books b1={"48lop","rg","sh",288017}; printf("%s\n",b1.title); printf("%s\n",b1.author); printf("%s\n",b1.sub); printf("%d",b1.b_id); return 0; }
内容的提问来源于stack exchange,提问作者Chiranjit Debnath
相关产品推荐
相关产品推荐

