[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'.
Насколько широко используется:
редко. Такой стиль инициализации массива считается плохим стилем кодирования.