Является ли объявление переменной внутри оператора if вредной привычкой? - PullRequest
0 голосов
/ 18 декабря 2018

Я предполагаю, что это может испортить шашки и анализ стека.Я не могу доказать свое предположение, и я не думаю, что C99 будет жаловаться.Вероятно, ни c89 не будет, потому что определение сразу после открытия фигурной скобки:

 if(true == condition){
       int i = 0; 
       /* do stuff with i */
 }else{ 
   foo():
 }

Два пути приведут к разному использованию стека.Объявление i вне оператора if / else приведет к более определенному использованию стека (хорошо, я разветвляюсь на foo, поэтому стек не будет точно таким же в обоих случаях).Но Мисра советует ограничить область действия переменной, ближайшей к ее использованию.

Я слишком обдумываю это или в моем предположении может быть обоснование?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Код подходит для любой версии C (за исключением того, что C90 не поддерживает true).

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

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

Если переменная размещена в регистре, она будет выделена только тогда, когда программа выберет путь, где в вашем примере объявлена ​​переменная.Это не потому, что объявление размещено, а потому, что этот путь будет выполнен.Опять же, ради производительности не имеет значения, где объявлена ​​переменная, если она находится где-то в локальной области, а не в области файла.

Хорошей практикой является ограничение области действия.переменные как можно больше.Но это делается для того, чтобы избежать непреднамеренных ошибок и конфликтов пространства имен.

Но Мисра советует ограничить область действия переменной, ближайшей к ее использованию.

Нет, это не так, но некоторые статические анализаторы требуют, чтобы вы сделали это, в дополнение к требованию MISRA.И MISRA-C: 2004 8.7, и MISRA-C: 2012 8.9 требуют, чтобы переменная помещалась только в область видимости блока, если она используется только одной функцией.Вот и все.

Однако MISRA говорит:

Внутри функции определение того, определены ли объекты в самом внешнем или самом внутреннем блоке, во многом зависит от стиля

0 голосов
/ 18 декабря 2018

Объявляет ли переменная внутри оператора if плохую привычку?

Нет.

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

Конечно, есть люди, которым все еще нравится видеть все переменные, определенные в самой верхней части кода.потому что это было соглашение в прошлом, как прокомментировал @Clifford.

Кстати, ваш код должен хорошо компилироваться, как с C89, так и с C99.

Эта мысль об использовании стека являетсярезультат обдумывания, и я предлагаю вам следовать древнегреческой фразе: Métron áriston.

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