-1

我听说调用int main(){...}是一种不好的做法,应该使用参数调用函数int main(int argc, char* argv[]){...},我想知道这是否可以推广到头文件中的函数声明

在某些情况下,可能必须在没有任何输入参数的头文件中编写函数原型(由于某些原因,比如说包含问题),并在一个遥远的 .c 文件中的函数定义中声明输入参数及其类型。这是否可能导致安全问题,因为人们可以利用这种信息缺失?还是函数定义(声明了输入参数)阻止了这一点?我找不到有关此的任何链接。

4

1 回答 1

2

在 C 中,当声明没有任何列出的参数的函数原型时,例如

voif my_function();  // No specified arguments

编译器将其视为声明一个具有未知数量的未知类型参数的函数。

这意味着调用者可以传递他们喜欢的任何参数,编译器会很乐意接受它,而无需检查正确性与否(因为这是不可能的)。对于翻译单元的其余部分,用于第一次调用的参数将被假定为函数采用的参数。

现在,如果另一个翻译单元使用不同的参数调用相同的函数,您会突然遇到不匹配的调用。如果即使一个调用与函数定义中的实际参数都不匹配,那么您将有未定义的行为


这当然不同于定义没有参数的函数:

void my_function()
{
    // Some code...
}

如果该函数尚未以其他方式声明,那么这也将函数声明为不带参数。这实际上等同于

void my_function(void)
{
    // Some code...
}

最后main功能。不允许声明main函数的原型,只能定义(实现)它。

Andint main(void)是该函数的一个有效变体,它(因为不允许使用原型)意味着您可以使用int main()它,因为它等同于int main(void).

于 2020-01-14T08:14:30.200 回答