R
Справочное
руководство по С++
R.18.2 С++ и ANSI C.
Вообще язык С++ обладает большими возможностями и налагает меньше
ограничений, чем ANSI C, поэтому большинство конструкций ANSI C
являются законными для С++, причем смысл их не меняется. Исключения
сводится к следующему:
- Любая программа на ANSI C, использующая в качестве идентификаторов
следующие служебные слова С++, не является программой на С++; $$R.2.4:
asm catch class delete friend
inline new operator private protected
public template try this virtual
throw
- Хотя это считается устаревшем в ANSI C, реализация С может налагать
драконовские ограничения на длину идентификаторов; в реализациях С++
это недопустимо; $$R.2.3.
- В С++ функция должна быть описана прежде, чем ее можно вызвать;
$$R.5.2.2.
- Описание f(); в С++ означает, что функция f не имеет параметров
($$R.8.2.5), а в С это означает, что f может иметь любое число
параметров любого типа. Такое описание считается устаревшим в ANSI C.
- В ANSI C можно несколько раз описать без спецификации extern глобальный
объект данных, в С++ возможно только одно его определение; $$R.3.3
- В С++ класс не может иметь тоже имя, что и имя typedef, относящееся
в той же области видимости к другому типу; $$R.9.1.
- В ANSI C операнд типа void* можно использовать в правой части
присваивания, а также при инициализации переменной типа указателя на
произвольный тип; в С++ это невозможно $$R.7.1.6.
- В ANSI C возможны команды переходов, обходящие инициализацию;
в С++ это невозможно.
- В ANSI C по умолчанию глобальный объект типа const подлежит
внешнему связыванию; для С++ это не так; $$R.3.3.
- Определения функций в "старом" стиле и вызовы неописанных функций
считаются в С++ анахронизмами, которые не обязательно должны
поддерживаться любой реализацией; $$R.18.3.1. В ANSI C они просто
считаются устаревшими.
- В С++ структура (struct) образует область видимости ($$R.3.2);
В ANSI C структура, перечисление или элемент перечисления,
описанные в структуре поднимаются в область видимости самой
структуры.
- Присваивание объекту типа перечисления значения, не принадлежащего
перечислению, считается в С++ анахронизмом и не должно поддерживаться
во всех реализациях; $$R.7.2. В ANSI C рекомендуется для таких
присваиваний выдавать предупреждение.
- Строки, инициализирующие символьные массивы, не могут быть длиннее
этих массивов; $$R.8.4.2.
- Тип символьной константы в С++ есть char ($$R.2.5.2) и int в
ANSI C.
- Тип элемента перечисления есть тип этого перечисления в С++ ($$R.7.2)
и тип int в ANSI C.
- Кроме того, стандарт ANSI для С допускает значительные различия в
допустимых реализациях языка, что может привести к еще большим расхождениям
между реализациями С++ и С. В частности, в некоторых реализациях С
могут быть допустимы некоторые несовместимые описания. В С++ требуется
совместимость даже для разных единиц трансляции; $$R.3.3.