Почему этот способ объявления функции устарел в C ++? - PullRequest
3 голосов
/ 13 июня 2011

этот тип объявления функции действителен в C, но почему не в C++?

int sum(i,j)int i,j;
{
  return i+j;
}

Ответы [ 5 ]

11 голосов
/ 13 июня 2011

Это потому, что это определение функции старого стиля не объявляет прототип. То есть вызывающая сторона не знает, какие типы параметров ожидает функция.

В C ++ это слишком большая ошибка безопасности типов. В частности, FDIS говорит

Изменение: В C ++ синтаксис определения функции исключает функцию C в "старом стиле". В C синтаксис «старого стиля» разрешен, но не рекомендуется использовать как «устаревший».

Обоснование: Прототипы необходимы для безопасности типов.

Влияние на исходный объект: Удаление семантически четко определенного объекта.

Сложность конвертации: Синтаксическое преобразование.

Насколько широко используется: Распространено в старых программах, но уже известно, что оно устарело.

3 голосов
/ 13 июня 2011

Это прототипы в стиле K & R, которые использовались в оригинальных версиях C. Теперь они в значительной степени забыты и заменены прототипами ANSI:

int sum(int i, int j)

Как уже говорили другие, прототипы K & R проблематичны при использовании в объявлениях функций, потому что они не включают информацию о типе. Предположительно, компилятор может проанализировать определение функции K & R для получения информации о типе, но я уверен, что ни один компилятор этого не делал.

0 голосов
/ 13 июня 2011

Действительно, он должен быть везде устаревшим, потому что он не так ясен, как:

int sum(int i, int j)
{
    return i+j;
}

... но я полагаю, что в C ++ его нет, особенно потому, что он очень похож на инициализацию, выполняемую в конструкторе (и поэтому ее можно спутать с ней):

void MyClass::MyClass():myVar(5)
{

}
0 голосов
/ 13 июня 2011

Почему оно должно быть действительным? C ++ предпочитает безопасность типов. Вам также не следует использовать такое объявление функций в C: оно сильно устарело

0 голосов
/ 13 июня 2011

Я думаю, потому что это снижает читабельность и не имеет никакого преимущества перед тем, что принято в C ++.

Также этот синтаксис усложняет объявления интерфейса.Когда K & R принял этот стиль, объектно-ориентированное и интерфейсное программирование не было популярно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...