为什么调用一个不接受带参数的参数的函数在C中编译但在C++中不编译

Mar*_*oun 15 c c++ gcc g++

假设我有这个功能:

void func() {}
Run Code Online (Sandbox Code Playgroud)

当我func使用某些参数(例如func(132))调用时,C++编译器会产生错误,而C编译器则不会.

在这种情况下,两个编译器之间有什么区别?C++这个错误产生了哪些优点/缺点?

Die*_*Epp 36

没有优点或缺点.C支持这一点,以便与20世纪80年代的K&R C兼容.如果你仍在使用你在20世纪80年代写的代码,你可能会喜欢这个功能.如果您希望从编译器获得更好的诊断,则可能不喜欢此功能.

void func();
Run Code Online (Sandbox Code Playgroud)

在C中,这意味着func需要未指定的参数.

如果需要指定该函数不带参数,请按以下方式编写:

void func(void);
Run Code Online (Sandbox Code Playgroud)

在C++中,两个原型是相同的.(在C中,只有第二个是原型.)如果使用GCC/Clang -Wstrict-prototypes选项进行编译,您将收到void func();在C中使用的警告,如您所愿.

这只是关于函数声明. 在这两种语言中,以下函数定义都是相同的:

// These two are the SAME
void func() { }
void func(void) { }

// These two are DIFFERENT
void func();
void func(void);
Run Code Online (Sandbox Code Playgroud)

  • @GrijeshChauhan:这个问题实际上是关于声明的,因为你没有声明`main()`,这实际上是一个单独的问题.但是,您可以将main定义为`int main()`,它与`int main(void)`完全相同,或者您可以将其定义为`int main(int,char**)`或某些兼容的方式,或者你可以用其他一些实现定义的方式来定义它.很多选择.在C中你甚至不必从`main()`返回一个结果,即使它应该返回`int`. (2认同)

pax*_*blo 8

在C++中,该函数没有参数.在C中,它表示不确定数量的参数.

这是从C的最早期开始的延续,其中每个函数返回一个,int并且对于传递的参数更加宽松.