•Служебное слово overload стало излишним и отнесено к разделу анахронизмов; §R.18.3.
•Произвольные выражения разрешены в качестве инициализаторов статических объектов; §R.8.4.
•Объекты, представляющие данные, могут быть volatile; §R.7.1.6. Также и в ANSI C.
•Допустимы инициализаторы для статических членов класса; §R.9.4.
•Функции-члены могут быть статическими; §R.9.4.
•Функции-члены могут быть const или volatile; §R.9.3.1.
•Можно явно указать связывание с подпрограммами на других языках; §R.7.4.
•Можно перегружать операции -›, -›* и `; §R.13.4.
•Классы могут быть абстрактными; §R.10.3.
•Для пользовательских типов префиксные и постфиксные операции различаются.
•Шаблоны типов; §R.14.
•Управление особыми ситуациями; §R.15.
Вообще язык 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, реализация С может налагать драконовские ограничения на длину идентификаторов; в реализациях C++ это недопустимо; §R.2.3.
•В C++ функция должна быть описана прежде, чем ее можно вызвать; §R.5.2.2.
•Описание f(); в C++ означает, что функция f не имеет параметров (§R.8.2.5), а в С это означает, что f может иметь любое число параметров любого типа. Такое описание считается устаревшим в ANSI C.
•В ANSI C можно несколько раз описать без спецификации extern глобальный объект данных, в C++ возможно только одно его определение; §R.3.3
•В C++ класс не может иметь тоже имя, что и имя typedef, относящееся в той же области видимости к другому типу; §R.9.1.
•В ANSI C операнд типа void* можно использовать в правой части присваивания, а также при инициализации переменной типа указателя на произвольный тип; в C++ это невозможно §R.7.1.6.
•В ANSI C возможны команды переходов, обходящие инициализацию; в C++ это невозможно.
•В ANSI C по умолчанию глобальный объект типа const подлежит внешнему связыванию; для C++ это не так; §R.3.3.
•Определения функций в "старом" стиле и вызовы неописанных функций считаются в C++ анахронизмами, которые не обязательно должны поддерживаться любой реализацией; §R.18.3.1. В ANSI C они просто считаются устаревшими.
•В C++ структура (struct) образует область видимости (§R.3.2); В ANSI C структура, перечисление или элемент перечисления, описанные в структуре поднимаются в область видимости самой структуры.
•Присваивание объекту типа перечисления значения, не принадлежащего перечислению, считается в C++ анахронизмом и не должно поддерживаться во всех реализациях; §R.7.2. В ANSI C рекомендуется для таких присваиваний выдавать предупреждение.
•Строки, инициализирующие символьные массивы, не могут быть длиннее этих массивов; §R.8.4.2.
•Тип символьной константы в C++ есть char (§R.2.5.2) и int в ANSI C.
•Тип элемента перечисления есть тип этого перечисления в C++ (§R.7.2) и тип int в ANSI C.
Кроме того, стандарт ANSI для С допускает значительные различия в допустимых реализациях языка, что может привести к еще большим расхождениям между реализациями C++ и С. В частности, в некоторых реализациях С могут быть допустимы некоторые несовместимые описания. В C++ требуется совместимость даже для разных единиц трансляции; §R.3.3.
R.18.2.1 Как бороться с расхождениями
В общем случае программа на C++ использует многие возможности, отсутствующие в ANSI C. Для такой программы незначительные расхождения, перечисленные в §R.18.2, явно перекрываются расширениями в С++. Когда C++ и ANSI C должны иметь общие заголовочные файлы, нужно позаботиться, чтобы эти файлы представляли текст на общем подмножестве этих языков.
•Нельзя пользоваться специфическими возможностями C++ такими, как классы, перегрузка и т.п.
•Нельзя использовать одно имя для обозначения типа структуры и другого типа.
•Функцию без параметров следует описывать как f(void), а не просто f().
•Глобальные объекты типа const следует явно специфицировать как static или extern.
Читать дальше