我知道有两种类型的函数:void
和返回某些函数的函数(int,double等)。但是如果在没有任何return语句的情况下声明函数怎么办?它被认为是void
函数吗?例如,
myFunction(int value){
.......
}
答案 0 :(得分:5)
声明没有任何返回类型的函数被视为返回int
。这是一个古老的规则,可以追溯到最初的K& R C,留在语言中以便向后兼容。
为float
个参数的double
参数的整数提升和转换是针对没有事先定义或前向声明的函数而出于同样的原因 - 向后兼容真正的旧代码。
毋庸置疑,依靠这些规则进行新的开发是一种非常糟糕的做法。应该始终明确声明返回类型,并在调用它们之前转发声明或定义所有函数。
答案 1 :(得分:0)
首先,我必须说出你的代码:
myFunction(int value){
.......
}
是一个功能定义,而不仅仅是声明。纯粹的声明就像:
myFunction(int value);
或
myFunction(int); //also valid but less recommended due to bad readability
另请注意,每个定义都可以作为函数的声明,但反之亦然。
让我们回到你的问题。根据早期标准,myFunction(int value);
等于int myFunction(int value);
。事实上,编译器将假设所有未声明的函数使用这些标准返回int
。
但是,没有类型的原型不是自C99以来的函数声明,尽管编译器很可能仍然将该类型视为int
。
无论如何,这是一种非常糟糕的编码风格,应该避免,因为无法执行编译时检查,并且依赖于未定义的行为,这些行为永远不值得信赖。如果您不需要返回值,则可以写:
void myFunction(int value);
另请参阅:Are prototypes required for all functions in C89, C90 or C99?
答案 2 :(得分:0)
如果您的标准编译器设置为根据C标准正确编译,则不允许使用此类函数。
例如gcc -std=c11 -pedantic-errors -Wall
。
如果你有一个20岁以上的编译器,那么允许这样的功能。如果没有明确说明,则返回类型将默认为int
。类似地,如果没有可见的函数原型,编译器将根据函数调用组成一个无意义的函数声明,如果没有原型可见,则返回类型将默认为int
。
为什么“隐含int”功能有意义,从来没有任何理由。它在实践中所做的是阻止编译器进行静态类型检查,从而创建了无数的bug。
因此,危险的“隐含的int”在1999年被迅速从C语言中删除。
这实际上是您不应该使用在2016年遵循某些古老版本的C语言的C编译器的主要原因之一。