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

Eri*_*ric 7 c++ warnings g++ 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++
Run Code Online (Sandbox Code Playgroud)

有人能告诉我:
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
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 11

编译带.cpp扩展名的文件时,默认情况下编译为C++代码.在C++语言中,函数声明的要求是强制性的硬性要求.-Wmissing-prototypes为C++ 做出选择是没有意义的.

换句话说,你不能在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++编译器将始终报告错误.

  • @Eric:对不起,但你说的没有意义.首先,在C++中,编译器*不允许你*调用未声明的函数,句点.其次,你的`myfunc`的例子完全不相关.在C++中,`myfunc(int,int)`和`myfunc(int)`是*两个完全不同的*(重载)函数.来电者不会"不同步".调用者只需调用另一个函数(假设也定义了).这是你的意图问题,而不是"编译器的指示".在C++中没有错误/问题,所以期待编译器的某些东西会很奇怪. (3认同)
  • 如果你忘了定义`myfunc(int)`,那么当然你会从链接器中得到一个错误.但同样,`myfunc(int)`和`myfunc(int,int)`是C++中两个完全不同的独立函数.您有责任申报并拨打正确的电话.如果你调用`myfunc(int)`,编译器将认为这就是你想要的.如果你只是想要调用`myfunc(int,int)`但是错误地调用`myfunc(int)`...抱歉,编译器无法读出你的想法来确定你实际上*想要*调用哪一个. (2认同)
  • 错误... gcc手册页明确地说"已定义",而不是"被称为"-Wmissing-prototypes:"如果在没有先前的原型声明的情况下定义了全局函数,则发出警告." 试试我在问题中包含的例子; 我很清楚,我并没有误解选项的含义.*调用*函数时打开警告的选项是-Wimplicit-function-declaration(aka -Wimplicit) (2认同)

Chr*_*ung 7

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

以下面的声明为例:

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


Ste*_*ato 6

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