•
Присваивание объекту типа перечисления значения, не принадлежащего перечислению, считается в 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.•
Для разделения частей программы на ANSI C и C++ можно использовать условную трансляцию с предописанным именем __cplusplus.•
Функции, которые могут вызываться из программ на обеих языках, должны быть явно описаны, как функции, подлежащие связыванию с С.R.18.3 Анахронизм
Реализация C++ может включать перечисленные здесь расширения, чтобы облегчить использование программы на С, или чтобы упростить переход с более ранних версий С++. Отметим, что с каждым расширением связаны нежелательные последствия. Если реализация предоставляет такое расширение, то она должно также предоставлять возможность убедиться в отсутствии этих последствий для исходной программы. Реализация C++ не обязана обеспечивать эти расширения.
•
При описании или определении функции можно использовать слово overload в конструкции спецификация-описания (§R.7). Если оно используется в спецификации-описания, то считается служебным словом и его нельзя использовать как идентификатор.•
Определение статического члена класса, представляющего данные, для которого дана стандартная инициализация нулями (§R.8.4, §R.9.4), может быть опущено.•
Можно использовать команды препроцессора старого стиля (до ANSI C).•
Можно присваивать объекту типа перечисления значение типа int.•
При удалении массива, тип которого не имеет деструктора, можно указывать число элементов; §R.5.3.4.•
Одна функция operator++() может использоваться для перегрузки как префиксных, так и постфиксных операций ++; тоже верно для операции --; §R.13.4.6.R.18.3.1 Определения функций старого стиля
Можно использовать синтаксис С для определений функций:
старое-определение-функции:
спецификации-описаний opt
список-описаний opt
старый-описатель-функции:
описатель ( список-параметров opt
список-параметров:
идентификатор
список-параметров , идентификатор
Приведем пример:
max(a,b) int b; { return (a‹b) ? b : a; }
Если определенная таким образом функция не была описана ранее, то тип ее формальных параметров полагается (…), т.е. он не будет проверяться.
Если она была описана, то тип должен согласовываться с типом, указанным в описании.
Приведенный синтаксис нельзя использовать для определения функций-членов.
R.18.3.2 Старый стиль задания инициализатора базового класса
В конструкции инициализатор-памяти (§R.12.6.2) можно не указывать имя-класса, обозначающее базовый класс при условии, что существует только один прямой (непосредственный) базовый класс. Поэтому в описании
class B {
//…
public:
B(int);
};
class D: public B {
//…
D(int i): (i) {/*… */}
};
будет вызываться конструктор B с параметром i.
R.18.3.3 Присваивание указателю this