Есть ли конкретная причина, по которой вызов функции не должен использоваться для инициализатора переменной в C - PullRequest
0 голосов
/ 25 апреля 2019

Я читаю несколько руководств по стилю, пытаясь стандартизировать мой стиль программирования.Читая руководства по стилям FreeBSD и OpenBSD для KNF, я заметил, что следующий абзац довольно запутанный.

Будьте осторожны, чтобы не запутать код, инициализируя переменные в объявлениях.Используйте эту функцию только вдумчиво.НЕ используйте вызовы функций в инициализаторах!

Существует ли техническая причина, по которой вызовы функций не должны использоваться при инициализации данных?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

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

Кстати, многие реализации предоставляют механизмы для выполнения некоторого пользовательского кода перед main.gcc это __attribute__((constructor)), но, конечно, это расширение.

0 голосов
/ 25 апреля 2019

Есть ли техническая причина, по которой вызовы функций не должны использоваться при инициализации данных?

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

Я принимаю логическое обоснование этого правила стиля в первом предложении цитаты:

Будьте осторожны, чтобы не запутать код, инициализируя переменные в объявлениях.

Авторы руководства по стилю, очевидно, считают использование инициализаторов потенциально запутывающим, и я подчеркиваю их акцент в последнем предложении, чтобы указать, что они считают использование вызовов функций для инициализации определенно запутывающим.

Я не согласен с этими рекомендациями по стилю. По моему мнению, переменные, как правило, должны быть инициализированы в своих объявлениях, если на самом деле существует значимое, семантически правильное значение для них в этой точке, и если это значение может быть удобно выражено через инициализатор. У меня также нет общих возражений против вызовов функций в инициализаторах. В частности, я бы обычно пересмотрел это:

void foo(void) {
    int result;
    result = do_something();
    // ...
}

на это:

void foo(void) {
    int result = do_something();
    // ...
}

. Я думаю, что последнее на самом деле немного яснее, и я ценю, что у него на одну строку меньше.

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