该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主,我再跟你说下吧。
int f()和int f(void)的区别,实际上这种问题没必要讨论,可以认为两者相同。为什么?
在C的标准中,int f()代表的是不定参数。C有种形参叫做“不定参数”,类似你调用printf(.....)的时候,它的参数就是不定参数,意思就是参数类型和数量不确定。但是,不定参数只有在使用va_list,va_start之类的情况下,才是有用的。就跟“不脱裤子放屁”和“脱裤子放屁”有什么区别?只有在裤子遇到屁会燃烧的时候才有用。但是谁会穿条遇到屁会燃烧的裤子?既然裤子遇到屁不会燃烧,为何要脱裤子再放屁?类似的,如果你不用va_list,怎么可能使用不定参数?也不可能达到不停参数的目的。既然你定义的函数都没有不定参数,区分有没有void有何意义?。所以,强调int f()和int f(void)在编译后的区别的人,都是脱裤子放屁。
为什么C的编译器(例如GCC)执行f(0)可以执行,但是C++不行呢?那是因为C的编译器不做这种强制性的类型检查,而C++做了这种检查。相应的,你在C++里,把一个不定参数的函数,声明为空参数,例如函数void f(int i,...),你声明为void f(),依然无法通过编译。这只能说标准上的严谨问题以及处理方式上的不同(但这不是代码实现上的不同)。
不用放屁这种比喻了,就拿编程来说吧,java等高级语言的编译器是会检查数组边界的,但是C和C++是不进行边界检查的,但是你不能说C和C++的数组是没有边界的,只是编译器不检查而已。
像@sunchy12345678 这种一上来就说“滚”什么的口臭男,非要强调放屁脱不脱裤子有很大区别的,我只想说,你倒是拿出一种因为区别而导致代码实现上的不同啊?别一直拿编译器检查报不报错来说事。而且,楼主你也说了,是在“定义”的时候。int f(){return 1;}和int f(void){return 1;}有什么区别了?@sunchy12345678 。不过如果楼主你定义了一个不定参数的int f(int i,...),那么你在c编译器下“声明”int f()和int f(void)是有区别的(c++无区别),也仅仅是编译器进行类型检查的区别,其他是没区别的。还是那句话,就在于放屁脱不脱裤子。
不过话说,虽然int f()和int f(void)是一样的,但是你加上void可以增加可读性,让人一看就知道没有参数。并且如果你用C++的话,如果f不重载,并且无参数,加上void会让人感觉一目了然。就跟一个人放屁脱裤子,会让人觉得,这个人要放屁了,一目了然。