如何从g ++中删除原型警告?

时间:2010-03-05 18:56:10

标签: c++ g++ warnings compiler-warnings

我目前有一个使用g ++编译代码的项目。我正在清理代码,我想确保所有函数都有原型,以确保正确处理const char *之类的东西。不幸的是,当我尝试指定-Wmissing-prototypes时,g ++会抱怨:

g++ -Wmissing-prototypes -Wall -Werror -c foo.cpp
cc1plus: warning: command line option "-Wmissing-prototypes" is valid for Ada/C/ObjC but not for C++

有人可以告诉我:
  1)为什么gcc这个无效?这是gcc中的错误吗?
  2)有没有办法打开这个警告?

修改

这是剪贴示例:

cat > foo.cpp <<EOF
void myfunc(int arg1, int arg2)
{
    /* do stuff with arg1, arg2 */
}
EOF
g++ -Wmissing-prototypes -c foo.cpp  # complains about not valid
g++ -c foo.cpp                       # no warnings
# Compile in C mode, warning appears as expected:
g++ -x c -Wmissing-prototypes -c foo.cpp

3 个答案:

答案 0 :(得分:10)

编译扩展名为.cpp的文件时,默认情况下编译为C ++代码。在C ++语言中,函数声明的要求是强制性的硬性要求。为C ++制作-Wmissing-prototypes选项毫无意义。

换句话说,你不能在C ++中“打开这个警告”因为“缺少原型”在C ++中始终是错误

P.S。作为旁注: prototype 的概念仅适用于C语言。 C ++中没有“原型”。

在C语言中,函数声明可以是原型,也可以不是原型,因此需要额外的术语来区分其他术语。在C ++中,函数声明总是“prototypes”(从C的角度来看),因此在C ++中根本不需要这个额外的术语。在C ++中,函数声明只是函数声明。这就是说明了一切。

编辑:在阅读您的评论后,我得出结论,您必须误解-Wmissing-prototypes选项的含义和目的以及相应的警告。请注意,此选项不会检查您是否已将所有函数的原型包含到某个头文件中。无论您使用的是C还是C ++,都无法在GCC中执行此操作。

-Wmissing-prototypes的目的不同。此选项仅在调用在调用时没有可见原型的函数时有效。在C语言中这样做是合法的,但如果您在此情况下需要警告,则使用-Wmissing-prototypes选项。在C ++语言中,调用在调用时没有可见声明(“prototype”)的函数总是立即出错,这就是为什么C ++编译器不需要-Wmissing-prototypes这样的选项。

换句话说,如果您在某个实现文件中定义了某个函数,但忘了在某个头文件中包含此函数的原型,那么在您实际尝试调用<之前,您将不会收到编译器的任何警告/ em>那个功能。无论您的代码是C还是C ++,无论您是否使用-Wmissing-prototypes都无关紧要......在您尝试调用该函数之前,不会有任何警告。

但是一旦你尝试在没有原型的情况下调用函数,C编译器将报告一个警告(如果你使用-Wmissing-prototypes),C ++编译器将始终报告错误。

答案 1 :(得分:7)

-Wmissing-prototypes不适用于C ++,因为C ++总是需要原型。

以下面的声明为例:

void foo();
  • 在C中,可以使用任何数量和类型的参数调用foo
  • 在C ++中,foo不接受任何参数(如果传入任何参数,编译错误)。

答案 2 :(得分:3)

您是否尝试过-Wmissing-declarations?这似乎适用于g ++并检测您描述的错误情况。我不确定他们添加了哪个版本,但它在4.3.3中适用于我。