Есть ли техническая причина, по которой вызовы функций не должны использоваться при инициализации данных?
Вызовы функций не только не должны, но не может использоваться для инициализации статических переменных или переменных, объявленных в области видимости файла. Однако их можно использовать для инициализации автоматических переменных внутри функций. Семантика выполнения этого хорошо определена, поэтому я не думаю, что есть техническая причина, по которой следует избегать таких инициализаций.
Я принимаю логическое обоснование этого правила стиля в первом предложении цитаты:
Будьте осторожны, чтобы не запутать код, инициализируя переменные в объявлениях.
Авторы руководства по стилю, очевидно, считают использование инициализаторов потенциально запутывающим, и я подчеркиваю их акцент в последнем предложении, чтобы указать, что они считают использование вызовов функций для инициализации определенно запутывающим.
Я не согласен с этими рекомендациями по стилю. По моему мнению, переменные, как правило, должны быть инициализированы в своих объявлениях, если на самом деле существует значимое, семантически правильное значение для них в этой точке, и если это значение может быть удобно выражено через инициализатор. У меня также нет общих возражений против вызовов функций в инициализаторах. В частности, я бы обычно пересмотрел это:
void foo(void) {
int result;
result = do_something();
// ...
}
на это:
void foo(void) {
int result = do_something();
// ...
}
. Я думаю, что последнее на самом деле немного яснее, и я ценю, что у него на одну строку меньше.