Комитет по стандартам C не видел необходимости запрещать компиляторам вести себя глупо, что делало бы их непригодными для многих целей. Действительно, в соответствии с опубликованным Обоснованием, Комитет признал, что реализация могла бы вести себя так, чтобы она соответствовала, но была бесполезна, но посчитала, что люди, стремящиеся создать качественные реализации языка, описанного в Стандарте, будут воздерживаться от такая глупость. Рассмотрим программу:
void byte_copy(unsigned char *dest, unsigned char *src, int len)
{
while(len--) *dest++ = *src++;
}
unsigned char src[10][10], dest[100];
void test(int mode)
{
if (mode == 0)
byte_copy(dest, src[0], 11);
else
byte_copy(dest, (unsigned char*)src, 100);
}
Для реализации может быть полезно перехватить test
, если mode
равно нулю, на основании того, что программист, вероятно, намеревался скопировать элементы из первой строки src
, и авторов стандарта вероятно, не хотел этого запрещать. С другой стороны, язык был бы серьезно нарушен, если бы подобный код в случае mode != 0
не мог использоваться для создания побайтной копии объектов всех типов, включая многомерные массивы, и Комитет, вероятно, признал это. Тем не менее, стандарт не признает различий между указателями, переданными в двух случаях.
Такое различие было бы необходимо только в том случае, если бы считалось, что язык будет нарушен, если реализации будут вести себя так, что сделают их бесполезными. Поскольку авторы стандарта заявили, что они признают, что он позволяет реализациям вести себя бесполезно, но не верят, что такая возможность нарушает язык, это может указывать на то, что они могут не рассматривать неспособность определить поведение всех необходимых конструкций как дефект в случаях, когда они ожидали, что качественные реализации языка, который был написан для описания стандарта, будут поддерживать такие конструкции в любом случае .
Что касается вопроса о том, можно ли рассчитывать на то, что люди, стремящиеся написать качественные реализации языка, который был написан для описания стандарта, воздержатся от такой глупости, на которую может быть трудно ответить, не зная мотивов людей, поддерживающих некоторые компиляторы .