Ключевое слово для функций в C ++? - PullRequest
5 голосов
/ 31 января 2020

Почему в C ++ нет ключевого слова для определения / объявления функций? В основном все другие абстракции дизайна в языке имеют одну (struct, class, concept, module, ...).

Не сделает ли язык более простым для разбор , а также более последовательный? Кажется, что большинство "современных" языков пошли по этому пути (fn в ржавчине, fun в kotlin, ...).

Ответы [ 3 ]

5 голосов
/ 31 января 2020
Синтаксис

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

[return type] [function name]([paramters]) { } 

Таким образом, если было введено ключевое слово function, мы могли бы получить более быстрый анализ и улучшить читаемость. Однако теперь у вас есть 2 разных способа объявить что-либо, и вы не можете избавиться от старого способа из-за необходимости обратной совместимости.


Но давайте предположим, что мы игнорируем аргумент обратной совместимости и предположим, что он был введен:

function int square(int a) { //1
    return a * a; 
} 

//-----------------------------

function square(int a) { //2
    return a * a; 
} 

case 1 просто ведет себя как индикатор ключевого слова, который имеет свои преимущества (читаемость, синтаксический анализ) и недостатки (спам объявления функций с ненужным шумом)

case 2 - это подход javascript -esque, позволяющий компилятору выяснить тип возвращаемого значения (например, auto здесь). это, вероятно, самый эстетичный c подход, но C ++ очень типизирован c, и это добавит слой путаницы, когда он не нужен (auto -ness может быть полезной, но, конечно, не всегда желаемой).


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


дополнительный бит:

, начиная с C ++ 11, языковые возможности позволили бы вам спорить о перикулярном подходе:

function square(int a) -> int { 
    return a * a; 
} 

, и это, безусловно, было бы неплохим solid решением! Но похоже, что обсуждение ключевого слова function давно затихло. Это понятно, когда есть много других, возможно, более важных, приоритетов для обсуждения при внедрении инноваций в новейшие выпуски C ++.

4 голосов
/ 31 января 2020

Ну, несмотря на то, что это своего рода современный язык (по крайней мере, я думаю, что C ++ 17 - это современный язык, но это ИМХО), C ++ должен иметь обратную совместимость с большинством C и Версии C ++, созданные за последние 50 лет или около того. В то время это была совершенно новая сфера деятельности, никто не знал, как это сделать лучше. Это был 1978 год! C создатели думали, что этого будет достаточно, это полностью их решение.

Внедрение новых ключевых слов сейчас разрушит существующий код, поэтому я не думаю, что это нормально.

Современный такие языки, как Rust, Kotlin и другие, имели безупречное время, чтобы подумать о том, что хорошо, а что нет, основываясь на существующих в настоящее время языках, тех, которые использовались в прошлом, а затем исчезли, и т. д. c.

Честно говоря, я думаю, что нынешний синтаксис в порядке, и с этим ничего не нужно делать.

Большинство неприятных разборов, конечно, проблема, но хорошо известная почти всем, кто использует C ++.

0 голосов
/ 31 января 2020

Потому что функции идентифицируются по-другому: через скобки после их имени. Обратите внимание, что функции взяты из C, в которых не упоминались эти абстракции дизайна. Следовательно, добавление нечетного ключевого слова не помогло бы придерживаться определенного языкового дизайна. Более того, наличие одного менее зарезервированного слова - неплохая вещь.

Если вам действительно нужно ключевое слово функции, вы можете сделать это:

#define FUNC auto
FUNC foo() -> Bar {
  baz();
} 
...