2015-01-14 2 views
4

В Google C++ Style Guide, он сказал:Руководство по стилю Google C++. Почему порядок ввода-вывода-вывода?

При определении функции, порядок параметра: входы, выходы.

В основном Google предложить параметр функции заказа, как:

void foo(const Foo& input1, const Foo& input2, Foo* output); 

Однако мой коллега предположил, что вывод должен быть помещен в первое положение. потому что таким образом foo может принимать значения по умолчанию, и большая часть времени не будет использовать значение по умолчанию. например:

void foo(Foo* output, const Foo& input1, const Foo& input2 = default); 

Я думаю, что он сказал, имеет смысл. Или есть что-то, чего нам не хватает здесь из аспектов читаемости, производительности, ...? Почему руководство по стилю предполагает, что вывод должен быть последним?

+0

Я не думаю, что есть какие-либо преимущества производительности для того. Это в основном вопрос вкуса. Независимо от того, что вы выбираете, просто быть последовательным, это использование. Я думаю, что именно по этой причине он упоминается в руководящих принципах, согласованности. – Mustafa

+0

Я предполагаю, что это единый стиль кода, оба из них доступны, и вы можете выбрать стиль, который лучше подходит для вашего требования. – wangxf

+0

Еще одна мысль в примере Google «может быть» - это оптимизация компилятора; т. е. если его использование с определенными оптимизациями компилятора делает для определенного типа двоичных файлов, которые они хотят достичь, это может сделать, поскольку «сделать его стандартным». Думаю, я склоняюсь к тому, что это стиль по функциональности – txtechhelp

ответ

7

Причина, почему это не является проблемой для руководства по стилю Google, потому что аргументы по умолчанию запрещены:

https://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Default_Arguments

Мы не допускаем параметры функции по умолчанию, за исключением ограниченных ситуаций, как описано ниже. При необходимости имитируйте их с перегрузкой функций, если это необходимо.

Pros

Часто у вас есть функция, которая использует значения по умолчанию, но иногда вы хотите, чтобы переопределить значения по умолчанию. Параметры по умолчанию позволяют легко сделать это без необходимости определять многие функции для редких исключений. По сравнению с перегрузкой функции аргументы по умолчанию имеют более чистый синтаксис с меньшим количеством шаблонов и более четкое различие между аргументами «требуется» и «необязательно».

Против

указателей на функцию путает при наличии аргументов по умолчанию, так как функция подпись часто не совпадает с подписью вызова. Добавление аргумента по умолчанию к существующей функции меняет свой тип, что может вызвать проблемы с кодом, принимающим его адрес. Добавление перегрузок функций позволяет избежать этих проблем. Кроме того, параметры по умолчанию могут привести к более громоздкому коду, поскольку они реплицируются на каждом сайте-вызове, в отличие от перегруженных функций, где «значение по умолчанию» появляется только в определении функции.

Решение

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

Единственное исключение - это когда функция является статической функцией (или в неназванном пространстве имен) в файле .cc. В этом случае минусы не применяются, поскольку использование функции настолько локализовано.

Кроме того, в конструкторах допускаются параметры функции по умолчанию. Большинство перечисленных выше недостатков не применяются к конструкторам, потому что их адрес невозможно.

Другим конкретным исключением является использование аргументов по умолчанию для имитации списков аргументов переменной длины.

// Support up to 4 params by using a default empty AlphaNum. 
string StrCat(const AlphaNum &a, 
       const AlphaNum &b = gEmptyAlphaNum, 
       const AlphaNum &c = gEmptyAlphaNum, 
       const AlphaNum &d = gEmptyAlphaNum); 
Смежные вопросы