我了解到使用空白参数列表定义函数与定义具有void
作为参数列表的函数不同。见(Is it better to use C void arguments "void foo(void)" or not "void foo()"?)。
这种误解对我来说似乎很常见,我感到惊讶的是gcc
和clang
都没有发出任何警告,即使我通过了-Wall -Wextra -pedantic
。
为什么会这样?
答案 0 :(得分:11)
-Wall
实际上只是开始,-Wextra
不是目前为止的结束。
而不是引用Stallman先生,并且不得不大肆削减我的舌头,以避免评论他的一些更有问题的意见(如Thomas Dickey提到的意见),我引用{{3强调我的:
-Wall
- 这样可以所有警告关于某些用户认为有问题的构造,以及易于避免(或修改以防止警告) ),即使与宏一起使用。
-Wextra
- 这样可以启用一些未被-Wall启用的额外警告标志。
所以,如果你说"所有,加上额外的",你实际上说的是#34;简单的,加上一些"。更好地检查手册以获取更多信息。
答案 1 :(得分:4)
其中一个原因可能是Richard Stallman的个人品味,他是gcc的创始人和首席开发人员。以下是我在上面提到的他的信息:
Date: Thu, 2 Sep 1999 23:19:27 -0400
Message-Id: <gnusenet199909030319.XAA08701@psilocin.gnu.org>
From: Richard Stallman <rms@gnu.org>
To: gnu-prog@gnu.org
Subject: On using -Wall in GCC
Reply-to: rms@gnu.org
Resent-From: info-gnu-prog-request@gnu.org
Status: RO
Content-Length: 841
Lines: 17
I'd like to remind all GNU developers that the GNU Project
does not urge or recommend using the GCC -Wall option.
When I implemented the -Wall option, I implemented every warning that
anyone asked for (if it was possible). I implemented warnings that
seemed useful, and warnings that seemed silly, deliberately without
judging them, to produce a feature which is at the upper limit of
strictness.
If you want such strict criteria for your programs, then -Wall is for
you. But changing code to avoid them is a lot of work. If you don't
feel inclined to do that work, please don't let anyone else pressure
you into using -Wall. If people say they would like to use it, you
don't have to listen. They're asking you to do a lot of work.
If you don't feel it is useful, you don't have to do it.
I never use -Wall myself.
在gcc-2.7.2.3的ChangeLog.4
文件中,-Wstrict-prototypes
选项(虽然出现在1992年1月的gcc 1.42中)首先被提及为与-Wall
不同:
Thu Nov 21 15:34:27 1991 Michael Meissner (meissner at osf.org)
* gcc.texinfo (warning options): Make the documentation agree with
the code, -Wstrict-prototypes and -Wmissing-prototypes are not
turned on via -Wall; -Wnoparenthesis is now spelled
-Wno-parenthesis.
(option header): Mention that -W options take the no- prefix as well
as -f options.
此外,在文档(gcc.info-3
)中,它出现在本段开头的部分中:
The remaining `-W...' options are not implied by `-Wall' because
they warn about constructions that we consider reasonable to use, on
occasion, in clean programs.
选项本身记录如下:
`-Wstrict-prototypes'
Warn if a function is declared or defined without specifying the
argument types. (An old-style function definition is permitted
without a warning if preceded by a declaration which specifies the
argument types.)
考虑到上下文,选项分离的原因很容易理解:这只是C标准化后的几年,很少有程序转换为ANSI C. gcc有其他选择可以帮助解决这个问题,例如,-Wtraditional
。
复杂工具的开发人员必须牢记兼容性。在类别之间移动选项可以保证打破一些人的构建脚本。例如,gcc也有
`-Werror'
Make all warnings into errors.
某些人经常使用
不必要地打开开发人员之前选择不使用的警告并因此停止编译不是保持兼容性的方法。
有关-Wall
与-Wstrict-prototypes
的更多相关内容,有助于阅读整个部分,而不是有选择地选择文本。 -Wall
-Wall
文档中的最后一段指出{{1}}并不全面,最终包含的原因是判断问题(如原始文档中所述):
请注意,-Wall不会暗示某些警告标志。他们中的一些人警告用户通常不认为有问题的结构,但有时您可能希望检查;其他人警告在某些情况下必要或难以避免的构造,并且没有简单的方法来修改代码以抑制警告。其中一些是由-Wextra启用的,但其中许多必须单独启用。
至于的判断 - 它将是1990年左右gcc的原始开发者。
答案 2 :(得分:0)
有很多遗留代码(从无效之前)会产生误导性的警告。随着时间的推移,新代码与旧代码的比率会发生变化,以便这些警告变得更有用。