如何定义编译器警告和错误,它们是否包含在标准中

时间:2011-10-27 14:14:33

标签: c++ c compiler-construction standards

关于这个问题question。编译器错误和警告是否已指定标准,如果不是,为什么不。我已经用gcc和vs编写了很长时间,并且学习警告和错误试图告诉你的不是统一的体验。使用像.net和java这样的语言,其中一个实体具有总体控制权,而不是一个有趣的问题。在标准警告和错误以及级别分类中是否会有一些价值。考虑到这些标准可用的编译器数量,我最感兴趣的是c ++或C.

2 个答案:

答案 0 :(得分:3)

它(显然?)因语言而异。

C标准根本不需要任何警告。它需要对任何违反约束或语法规则的翻译单元进行“诊断”,但不要求拒绝翻译单元。必须拒绝翻译单元的唯一情况是它包含#error指令而不是#if。 C ++规则类似。 gcc通常会警告约束违规,但您可以使用-pedantic-errors进行更改。

这样做的一个优点是它允许编译器实现扩展。例如,如果它将0b11001001识别为二进制常量,则可以发出语法错误警告,然后继续编译该程序。

另一方面,Ada要求编译器拒绝有错误的源文件,并且需要编译时警告(不会导致编译失败)。

对于定义,警告是一种不会导致编译失败的诊断。

定义分类会很有用,但跨语言这样做是不切实际的。

答案 1 :(得分:0)

据我所知,语言标准仅定义了符合标准的语言实现(例如编译器)对符合规范的程序源的作用。他们没有定义警告可以是什么。他们确实谈到“未定义”或“特定于实现”的行为。

例如,GCC可能会根据其版本(4.6比4.5更精确)和所请求的优化提供不同的警告。

相关问题