我目前有一个使用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
答案 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();
foo
。foo
不接受任何参数(如果传入任何参数,编译错误)。答案 2 :(得分:3)
您是否尝试过-Wmissing-declarations?这似乎适用于g ++并检测您描述的错误情况。我不确定他们添加了哪个版本,但它在4.3.3中适用于我。