【问题标题】:Why calling a function that accepts no parameters with a parameter compiles in C but doesn't in C++为什么调用一个不接受带参数的函数的函数在 C 中编译但在 C++ 中不编译
【发布时间】:2012-11-26 09:01:47
【问题描述】:

假设我有这个功能:

void func() {}

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

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

【问题讨论】:

  • 最好不要在没有 -Wall 标志的情况下使用 gcc 进行编译。
  • @MaximYegorushkin: -Wall 不会抓住这个,因为它不包括 -Wstrict-prototypes。我使用-Wall -Wextra -Wpointer-arith -Wwrite-strings -Wmissing-prototypes -Wstrict-prototypes,但每个人都有自己喜欢的一组警告标志。

标签: c++ c gcc g++


【解决方案1】:

没有优点或缺点。 C 支持这一点,以便与 1980 年代的 K&R C 兼容。如果您仍在使用 1980 年代编写的代码,您可能会喜欢此功能。如果您想从编译器获得更好的诊断,您可能不喜欢此功能。

void func();

在 C 中,这意味着 func 采用 未指定 参数。

如果需要指定函数带没有个参数,这样写:

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);

【讨论】:

  • 就像 main() 可以带参数也可以不带参数?
  • @GrijeshChauhan:这个问题实际上是关于声明的,因为你没有声明main(),这实际上是一个单独的问题。但是,您可以将 main 定义为int main(),这与int main(void) 完全相同,或者您可以将其定义为int main(int, char**) 或某种兼容的方式,或者您可以以其他一些实现定义的方式定义它。很多选择。在 C 中,您甚至不必从 main() 返回结果,即使它应该返回 int 否则。
  • 实际上对于 gcc 选项,我认为 -std=c99 -Wall 应该足以获得诊断。
  • @JensGustedt:您使用的是哪个版本的 GCC?我在 4.7.2 上没有收到警告。
  • @DietrichEpp,对不起,我一定搞混了。
【解决方案2】:

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

这是 C 语言早期的保留,每个函数都返回一个 int,并且在传递参数时更加轻松。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2014-12-13
    相关资源
    最近更新 更多