我听说调用int main(){...}
是一种不好的做法,应该int main(int argc, char* argv[]){...}
调用带有参数的函数,我想知道这是否可以推广到标头中的函数声明。
在某些情况下,可能必须在标头中编写一个函数原型,在输入上没有任何参数(出于某些原因,包括麻烦(,并在遥远的 .c 文件中声明函数定义中的输入参数及其类型。这是否可能导致安全问题,因为人们可以利用这种信息的缺失?还是函数定义(声明了输入参数(阻止了这种情况?我找不到任何关于此的链接。
在 C 中声明没有任何列出参数的函数原型时,如
voif my_function(); // No specified arguments
编译器将其视为声明具有未知数量的未知类型参数的函数。
这意味着调用者可以传递他们喜欢的任何参数,编译器会很乐意接受它,而无需检查正确性(因为这是不可能的(。对于翻译单元的其余部分,将假定用于第一次调用的参数是函数采用的参数。
现在,如果另一个翻译单元使用不同的参数调用相同的函数,则突然会出现不匹配的调用。即使一个调用与函数定义中的实际参数不匹配,那么你将有未定义的行为。
这当然不同于定义没有参数的函数:
void my_function()
{
// Some code...
}
如果尚未以其他方式声明该函数,则这也会将该函数声明为不带参数。这实际上等同于
void my_function(void)
{
// Some code...
}
最后是main
函数。不允许声明main
函数的原型,只能定义(实现(它。
int main(void)
是函数的有效变体,这(因为不允许使用原型(意味着您可以使用int main()
,因为它等效于int main(void)
。