C 没有任何返回类型的函数

C 没有任何返回类型的函数,c,function,C,Function,我知道有两种类型的函数:void和返回某些内容的函数(int、double等)。但是,如果函数在声明时没有任何返回语句,该怎么办?是否将其视为void功能?比如说, myFunction(int value){ ....... } 未声明任何返回类型的函数被视为返回int。这是一条可以追溯到原始K&R C的古老规则,保留在语言中用于向后兼容 整数提升和将float参数转换为doubles是针对没有预先定义或前向声明的函数进行的,原因相同-向后兼容真正的旧代码 不用说,依靠这些规则进行新的发展是

我知道有两种类型的函数:
void
和返回某些内容的函数(int、double等)。但是,如果函数在声明时没有任何返回语句,该怎么办?是否将其视为
void
功能?比如说,

myFunction(int value){
.......
}

未声明任何返回类型的函数被视为返回
int
。这是一条可以追溯到原始K&R C的古老规则,保留在语言中用于向后兼容

整数提升和将
float
参数转换为
double
s是针对没有预先定义或前向声明的函数进行的,原因相同-向后兼容真正的旧代码


不用说,依靠这些规则进行新的发展是一种非常糟糕的做法。应该始终显式声明返回类型,并在调用它们之前向前声明或定义所有函数。

首先,我必须说您的代码:

myFunction(int value){
.......
}
是一个函数定义,而不仅仅是一个声明。纯声明将类似于:

myFunction(int value);

还要注意,每个定义都可以作为函数的声明,但反之亦然

让我们回到你的问题上来<代码>myFunction(int值)等于
int myFunction(int值)根据早期标准。事实上,编译器将使用这些标准假定所有未声明的函数都返回
int

然而,从C99开始,没有类型的原型就不是函数声明,尽管编译器很可能仍然将该类型视为
int

无论如何,这是一种非常糟糕的编码风格,应该避免,因为编译时检查无法执行,而且您依赖于未定义的行为,这些行为永远都不可信。如果不需要返回值,可以编写:

void myFunction(int value);

另请参见:

如果您的标准编译器设置为根据C标准正确编译,则不允许使用此类函数

例如,
gcc-std=c11-pedanticerrors-Wall

如果你有一个20多年的编译器,这样的函数是允许的。如果没有明确说明,返回类型将默认为
int
。类似地,如果没有可见的函数原型,编译器将根据函数调用生成无意义函数声明,如果没有可见的原型,则返回类型将默认为
int

为什么“隐式int”特性有意义,从来没有任何理由。实际上,它所做的是阻止编译器进行静态类型检查,因此产生了无数的bug

因此,危险的“隐式int”在1999年被迅速从C语言中删除


这实际上是为什么你不应该在2016年使用一个遵循某种古老版本的C语言的C编译器的主要原因之一。

在“旧时代”,默认为
int
。不确定这是否仍然是正确的解释…@John3136这在C99之前是正确的。从那以后,它的形式就不好了。@M.M.谢谢。我怀疑这可能不再正确了。我忍不住想问“为什么会有人想这么做”,但这并不是真的相关!未声明的函数是否被视为使用未指定的参数列表(
()
)声明的函数?@Quentin谢谢!你说得对,这与未指定参数列表的规则相同(整数提升、浮点变为双倍等)。@C89中的昆汀调用未声明的函数,就像该函数已声明一样
int f()。由于C99删除了该规则,因此调用未声明函数的格式不正确。关于省略返回类型含义
int
的规则也在C99中删除。现在,该代码的格式不正确。引用SO C标记的用法:“除非问题明确提到使用的是哪个版本的C标准,否则假定使用的是当前版本。也就是说,ISO当前列出的ISO 9899的哪个版本为活动版本。在回答/评论标记为C的问题时,请记住这一点。”
void myFunction(int value);