main()在C和C++中定义函数的正确(最有效)方法是什么- int main()或void main()- 为什么?如果int main()那么return 1或return 0?
这个问题有很多重复,包括:
main()函数的有效签名是什么?main()函数void main()和int main()?main()在C++中的签名main()? - 对于C++,确实有一个非常好的答案.main()C语言中的函数样式main()C中的方法类型int main()vs void main()在C中有关:
考虑以下计划:
#include <iostream>
int main = ( std::cout << "C++ is excellent!\n", 195 );
Run Code Online (Sandbox Code Playgroud)
在Windows 7操作系统上使用g ++ 4.8.1(mingw64),程序编译并运行正常,打印:
C++非常棒!
到控制台.main似乎是一个全局变量而不是一个函数; 如果没有该功能,该程序如何执行main()?这段代码是否符合C++标准?程序的行为是否定义明确?我也使用了该-pedantic-errors选项,但该程序仍然编译并运行.
我正确地说连接器没有进行功能参数检查.它们不检查函数调用的数量或类型,也不检查全局数据引用的类型.所有连接体都是如此吗?
我在x86-64上使用Clang瞄准Linux.链接器是否检查引用是否在正确的段中?或者就链接器而言,外部引用实际上只是一个void*?
我来自高级语言背景C#和Scala,所以对于那些沉浸在低级别世界中的人来说,这似乎是显而易见的.我在汇编程序中编写了几个函数(系统调用),我注意到汇编程序中没有外部函数的参数原型.
上下文:我实际上是在编写一个编译器.目前我的目标是使用汇编程序函数进行系统调用的预处理C .i文件,但替代方案是C++,汇编程序甚至是机器代码,所以我试图权衡成本和收益,特别是类型检查.汇编器/编译器/ 链接器我可以用来检查我自己的程序及其函数原型生成的正确性.
以下是我的demo.c文件:
main;
Run Code Online (Sandbox Code Playgroud)
在编译这个gcc时会发出警告:
demo.c:1:1:警告:数据定义没有类型或存储类[默认启用]
运行./a.out会出现分段错误:
分段故障(核心转储)
是因为,(1)main没有在任何地方定义,我们正在尝试执行它;(2)我们在任何函数之外使用命令语句,因此它无法执行.
在任何一种情况下,我仍然不明白为什么它应该抛出一个段错误.
更新:它可能看起来类似于Is'int main;' 一个有效的C/C++程序?,但这是不同的,因为不使用任何标识符,编译代码.