繁体   English   中英

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

[英]How do I get missing prototype warnings from g++?

我目前有一个使用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

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

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

PS作为旁注: 原型的概念仅针对C语言。 C ++中没有“原型”。

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

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

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

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

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

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

以下面的声明为例:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM