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

时间:2012-11-26 09:01:47

标签: c++ c gcc g++

假设我有这个功能:

void func() {}

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

在这种情况下,两个编译器有什么区别? C++出现此错误有哪些优点/缺点?

2 个答案:

答案 0 :(得分:36)

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

void func();

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

如果您需要指定该函数采用 no 参数,请按以下方式编写:

void func(void);

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

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

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

// These two are DIFFERENT
void func();
void func(void);

答案 1 :(得分:8)

在C ++中,该函数没有参数。在C中,它意味着不确定数量的参数。

从C的最早期开始,这是一个保留,其中每个函数都返回int,而且传递的参数更加宽松。