Прежде всего, компиляторы должны поддерживать стандарт. Это правда, даже если стандарт кажется неловким задним числом. Во-вторых, поставщики компиляторов добавляют расширения. Например, многие компиляторы поддерживают это:
(char *) p += 100;
для перемещения указателя на 100 байтов вместо 100 любого типа p
является указателем на. Строго говоря, это нестандартно, потому что приведение убирает lvalue-ness p
.
Проблема с нестандартными расширениями заключается в том, что вы не можете на них рассчитывать. Это большая проблема, если вы когда-нибудь захотите переключать компиляторы, делать свой код переносимым или использовать сторонние инструменты.
C в значительной степени является жертвой собственного успеха. Одной из основных причин использования C является мобильность. Существуют компиляторы C практически для каждой существующей аппаратной платформы и ОС. Если вы хотите иметь возможность запускать ваш код где угодно , вы пишете его на C. Это создает огромную инерцию. Почти невозможно что-либо изменить, не жертвуя при этом одним из лучших преимуществ использования языка.
Результат для разработчиков программного обеспечения заключается в том, что вам может потребоваться записать с наименьшим общим знаменателем, обычно ANSI C (C89). Например: Parrot, виртуальная машина, на которой будет работать следующая версия Perl, написана на языке ANSI C. Perl6 будет иметь чрезвычайно мощный и выразительный синтаксис с некоторыми изгибающими концепциями, встроенными прямо в язык. Реализация, однако, строится с использованием языка, который является почти полной противоположностью. Причина в том, что это позволит Perl работать где угодно: ПК, Mac, Windows, Linux, Unix, VAX, BSD ...