实施是否在任何特定情况下提供任何有用的诊断的问题是标准管辖范围之外的实施质量问题。如果一个实现无条件地输出“警告:这个程序没有输出任何有用的诊断”甚至“警告:水是湿的”,那么即使实现没有,这样的输出也将完全满足标准关于诊断的所有要求输出任何其他诊断。
此外,该标准的作者将许多行为描述为“未定义的行为”,他们期望这些行为会被许多(如果不是大多数)实现以有意义和有用的方式处理。根据已发布的基本原理文档,未定义的行为除其他外“识别符合语言扩展的区域”,因为允许实现指定它们在标准未定义的情况下的行为方式。
让实现对不可移植的构造发出警告,但它们会以有用的方式处理这些构造会很烦人。
在标准之前,一些实现将有用地接受以下结构:
struct foo {
int *p;
char pad [4-sizeof (int*)];
int q,r;
};
对于不超过四个字节的所有大小的指针(当时还没有 8 字节指针),而不是在指针正好是四个字节时大喊大叫,但是委员会中的一些人反对接受零声明的想法-大小的数组。因此,达成了一种妥协,编译器会对这些事情大喊大叫,程序员会忽略无用的警告,而有用的结构将在支持它们的实现上仍然可用。
虽然有一种模糊的尝试来区分应该产生程序员可以忽略的警告的构造,与可能使用太多以至于警告会令人讨厌的构造,但发布有用的诊断是标准管辖范围之外的实施质量问题意味着没有必要过多担心这种区别。