2010-10-16 5 views
2

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

error: name lookup of ‘count’ changed for ISO ‘for’ scoping 
note: (if you use ‘-fpermissive’ G++ will accept your code) 

переменная рециркуляция считается плохой практикой в ​​разработке профессионального программного обеспечения, или это ситуативное беспокойство, и какие другие последствия я пропустил здесь?

ответ

4

Вы делаете это?

for(int count = 0; ...) 
{ 
    ... 
} 

for(count = 0; ...) 
{ 
    ... 
} 

Сомневаюсь gcc хотел бы, что, так как второй count не в области. Я думаю, что это относится только к первому циклу for, но у gcc есть варианты, чтобы принять плохой код. Если вы либо сделаете второй int count, либо перенесите первый в внешний масштаб, gcc должен быть счастлив.

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

+0

Это, казалось, воспроизводило выход компилятора OP. Хороший звонок. –

+0

Это именно то, что я делал, и ваш совет устранил проблему. Большое спасибо. –

2

Steve McConnell рекомендует не повторно использовать локальные переменные в функциях в Code Complete.

Он не является окончательным голосом практики в профессиональной разработке программного обеспечения, но он близок к тому, что вы достигнете окончательного голоса.

Аргумент в том, что это затрудняет чтение кода.

Что вы считаете? Назовите переменные после этого.

+0

Имеет ли имя Стив Макконнелл подтверждение? Я не слышал о нем. Может быть, я был под скалой :) << Я написал это, прежде чем вы добавили больше своего ответа. Все еще интересно, почему имя здесь полезно здесь - я думаю, что его рассуждения очень полезны здесь, хотя так спасибо. (Мы оба редактируем обновление в одно и то же время. Fun.) –

+0

Код Завершить - это книга, которую я собираюсь подобрать некоторое время. На многие мои вопросы ответили цитаты из этого, что я думаю, что пришло время, когда я общался с ним. Спасибо за ваш вклад. –

2

Похоже, вы определяете переменную в for? т. е. «для (int count = 0; count ++; count < x)»? Если это так, это может быть проблематичным, а также неясным. Если вы собираетесь использовать его во втором цикле, определите его за пределами обеих петель.

+0

Это действительно проблема. Код теперь скомпилирован без каких-либо ошибок или предупреждений. Благодарю. –

1

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

for (int i ...; ... ; ...) { 
    ... 
} 
for (int i ...; ... ; ...) { 
    ... 
} 

Однако, если вы намерены тень еще одну переменную:

int i ...; 
for (int i ...; ... ; ...) { 
    ... 
} 

это красный флаг.

Смежные вопросы