实现并不是通过扩展“取消”需求,而是扩展添加了标准不支持的功能。主要要求是扩展不会改变任何严格符合的程序。
符合C11 标准的第 4p6 节的定义如下:
两种形式的一致性实现是托管的和独立的。符合要求的托管实现应接受任何严格符合要求的程序。符合标准的独立实现应接受任何严格符合标准的程序,其中库条款(第 7 条)中指定的功能的使用仅限于标准头文件的内容 [...为简洁而省略...]。 一个符合要求的实现可以有扩展(包括额外的库函数),只要它们不改变任何严格符合的程序的行为
如果第 4p5 节中定义了严格符合的程序:
严格遵守的程序应仅使用本国际标准中指定的语言和库的那些特性。它不应产生依赖于任何未指定、未定义或实现定义的行为的输出,并且不应超过任何最小实现限制
第 4p7 节定义了一个符合要求的程序:
符合标准的程序是符合标准的实现可接受的程序。
因此,鉴于您之前的问题中的程序案例:
static int arr[ ];
int main( void )
{
return arr[ 0 ];
}
static int arr[ ] = { 0 };
这不是一个严格遵守的程序,因为它违反了 6.9.2p3。然而,诸如 gcc 之类的一些实现允许将其作为扩展。支持这样的功能并不会阻止类似的严格遵守的程序,例如
static int arr[1];
int main( void )
{
return arr[ 0 ];
}
static int arr[ ] = { 0 };
从行为上有所不同。因此,支持此功能的实现仍然有资格作为符合标准的实现。这也意味着第一个程序虽然不是严格符合的程序,但它是符合程序的,因为它将在符合要求的实现上以明确定义的方式运行。