Annex C (informative) Compatibility [diff]

C.1 C++ and ISO C [diff.iso]

C.1.7 Clause [dcl.decl]: declarators [diff.decl]

[dcl.fct]
Изменение: в C ++ функция, объявленная с пустым списком параметров, не принимает аргументов. В C пустой список параметров означает, что количество и тип аргументов функции неизвестны.

Пример:

int f();            // means   int f(void) in C++
                    // int f( unknown ) in C


Обоснование: Это сделано для того, чтобы избежать ошибочных вызовов функций (т. Е. Вызовов функций с неправильным числом или типом аргументов).
Влияние на исходную функцию: изменение семантики четко определенной функции. Эта функция была отмечена как «устаревшая» в C.
Сложность преобразования: синтаксическое преобразование. Объявления функций, использующие стиль неполного объявления C, должны быть завершены, чтобы стать объявлениями полных прототипов. Программа может нуждаться в дальнейшем обновлении, если разные вызовы одной и той же (не являющейся прототипом) функции имеют разное количество аргументов или если тип соответствующих аргументов различается.
Насколько широко используется: Обычный.

[dcl.fct] [см. [expr.sizeof]]
Изменение: В C ++ типы не могут быть определены в возвращаемых типах или типах параметров. В C эти определения типов разрешены.

Пример:

void f( struct S { int a; } arg ) {}    // valid C, invalid C++
enum E { A, B, C } f() {}               // valid C, invalid C++


Обоснование: при сравнении типов в разных единицах перевода C ++ полагается на эквивалентность имен, тогда как C полагается на структурную эквивалентность. Что касается типов параметров: поскольку тип, определенный в списке параметров, будет находиться в области действия функции, единственные допустимые вызовы в C ++ будут из самой функции.
Влияние на исходный объект: удаление семантически четко определенного объекта.
Сложность преобразования: семантическое преобразование. Определения типов необходимо переместить в область файла или в файлы заголовков.
Насколько широко используется: редко. Такой стиль определения типа считается плохим стилем кодирования.

[dcl.fct.def]
Изменение: В C ++ синтаксис определения функции исключает функцию C «старого стиля». В C синтаксис «старого стиля» разрешен, но считается устаревшим.
Обоснование: прототипы необходимы для обеспечения безопасности типов.
Влияние на исходный объект: удаление семантически четко определенного объекта.
Сложность преобразования: синтаксическое преобразование.
Насколько широко используется: часто встречается в старых программах, но уже известно, что они устарели.

[dcl.init.string]
Изменение: В C ++ при инициализации массива символов строкой количество символов в строке (включая завершающие '\0') не должно превышать количество элементов в массиве. В C массив может быть инициализирован строкой, даже если массив недостаточно велик, чтобы содержать завершающую строку '\0'.

Пример:

char array[4] = "abcd";         // valid C, invalid C++


Обоснование: манипулирование этими незавершенными массивами стандартными строковыми функциями может привести к серьезной катастрофе.
Влияние на исходный объект: удаление семантически четко определенного объекта.
Сложность преобразования: семантическое преобразование. Массивы должны быть объявлены на один элемент больше, чтобы содержать завершающую строку '\0'.
Насколько широко используется: редко. Такой стиль инициализации массива считается плохим стилем кодирования.