2015-04-16 69 views
3

我只在半小时前才了解到defining a function with a blank argument list is not the same as defining a function with void as the argument list。这种误解对我来说似乎很常见,我很惊讶,即使我通过了-Wall -Wextra -pedanticgccclang都没有发出任何警告。为什么是这样?默认情况下,为什么不打开-Wstrict-prototypes?

+2

不久之前,Richard Stallman向邮件列表发送了一条消息,解释其他人发现警告有用,但他没有。可能对默认值有一定影响。 –

+2

应该提醒Richard Stallman编译器会被很多不自动编写正确代码的人使用。但是,没有启用该编译器开关允许程序在没有原型的情况下编写具有定义的函数的代码,只要该函数在被调用之前声明为 – user3629249

+0

这是向后兼容性问题。在旧C中,当函数以空参数列表呈现给编译器时,这意味着它是未定义的参数列表,编译器假定您没有指定参数的数量和类型。为了节省这一点,并为了符合检查参数的ANSI-C要求,选择了“void”关键字。 –

回答

10

-Wall其实只是个开始,而-Wextra还没有到目前为止的路程。

与其引用斯托曼先生的话,为了避免评论他的一些更可疑的观点(比如托马斯迪基提到的观点),我宁愿引用the current GCC manuals,强调我的:

-Wall - 这使得关于某些用户认为有问题,很容易避免(或修改来禁止警告)结构,并且警告,即使是与宏一起。

-Wextra - 这使一些额外的警告标志不是由-Wall启用。

所以,如果你说“全部,再加上”,你实际上是在说“简单的,再加上一些”。更好地检查该手册。

+0

我当然会认为函数定义中的未指定参数是一个_questionable构造。事实上,我这样定义函数的唯一原因是因为我认为它是在参数列表中用'void'定义它们的_same_。使用未指定参数定义的简单'warning:函数(或者甚至是当前的'-Wstrict-prototypes'消息)将指向我(和其他许多人,我敢肯定)正确的方向。一旦你知道了,你一定很容易避免 - 你也可以让你的编辑为你做集体工作。 –

+3

@BlacklightShining:这里的信息是,a)*总是以最严格的错误检查模式运行编译器*,b)'-Wall -Wextra'不是。 ;-) – DevSolar

+1

Downvoted“没用”没有评论为什么。 SO的祸根再次袭来。 – DevSolar

2

其中一个原因可能是Richard Stallman的个人品味,他是gcc的创建者和原始首席开发人员。下面是他的信息,其余上面提到:从-Wall是不同首先提到

Date: Thu, 2 Sep 1999 23:19:27 -0400 
Message-Id: <[email protected]> 
From: Richard Stallman <[email protected]> 
To: [email protected] 
Subject: On using -Wall in GCC 
Reply-to: [email protected] 
Resent-From: [email protected] 

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.3ChangeLog.4文件时,-Wstrict-prototypes选项(尽管存在于GCC 1.42在1992年1月):

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的更多上下文,有助于阅读整个部分,而不是有选择地挑选文本。在current文档的最后一段为-Wall例如指出-Wall是不全面的,并最终纳入的原因是判断的问题(如原始文档中):

注意一些警告标志不由-Wall暗示。其中一些人警告用户通常不认为有问题的建筑,但有时候您可能希望检查;其他人警告在某些情况下必要或难以避免的构造,并且没有简单的方法来修改代码来抑制警告。其中一些由-Wextra启用,但其中许多必须单独启用。

至于那个判断 - 这将是海湾合作委员会的原始开发商1990年左右

+1

没有帮助,因为它既不给出好建议也不反映'-Wall'的当前含义。 – DevSolar

+0

基于这个邮件,你也可以做出这些论点:1. RMS对GCC开发者默认的-Wall没有影响,因为他甚至不使用该标志。 2.没有人要求 - 将严格原型添加到默认设置中,因为RMS表示他包含了人们要求的所有内容。尽管这也没有真正回答任何问题。 – nos

+0

虽然它在技术上不是一个答案,但只是一个引用它是一个,如果一个人使用几个脑细胞。在技​​术上不可能在评论中提供这些信息,所以别傻了,伙计们。 –

0

有很多的遗留代码在那里(从之前的空隙),它会抛出误导性的警告。随着时间的推移,新代码与旧代码的比例发生变化,这些警告变得更有用。

+1

并非如此(自1989年以来,“空白”就是标准)。 –

+0

我改变了我的想法;-)。 –

相关问题