以下是引用wmf2014在2015-8-13 17:42:40的发言:
我并不反对main函数return有意义的值,只是认为编译器不能把main返回int值作为标准。是否返回有意义的值应该是程序员自己决定的,而main函数类型也应该是宽泛的,不能因为没有定义成int main,编译器就不能通过编译。
主要在这一句“
是否返回有意义的值应该是程序员自己决定的”,不是这样的,传入的参数和返回的值 是调用者和被调用者之间的约定,一个程序不能自己执行完毕就万事不顾了,它得遵守约定,除非这个程序是个操作系统,没有更上层的调用者了。
例如,我需要扫描照片,并识别出照片中的人物是谁,我的伪代码可以这么写:
调用 某扫描程序A
等待A结束,并取得A的退出码
如果 A的退出码 == 0
{
调用 某人脸识别程序B
等待B结束,并取得B的退出码
如果 B的退出码 == 0
{
……
}
}
在这段代码中,A和B程序可以替换成任意一个程序,完美而通用。
但一旦有人不遵守约定,即随机给出个退出码,那么这段代码就完全废掉了,因为没法判断对方是遵守约定给了我一个正确的退出码,还是没遵守约定给我了一个随机值。就是通常所说的:一颗老鼠屎坏了一锅粥。
而你说的“
不能因为没有定义成int main,编译器就不能通过编译”,我想不通为什么要定义成void main,总得有个好处吧?!(标准规定main函数中return 0;是可以省略的)
虽然C标准中对main只是简单说了一句“or in some other implementation-defined manner.”,但不言而喻的是这个 implementation-defined manner 不能破坏掉标准规定的两种main形式。
例如 char* main(void) 就不行
而 int main(int argc, char *argv[], double a, _Bool b) 就可以。
退一步,即使void main编译通过了,因为这属于implementation-defined,因此它不具有移植性,不具有和其它程序的交互能力。void比int还需要多打一个字,费这功夫,就为了使自己的代码烂掉?!