используя макрос для создания цикла в C - PullRequest
4 голосов
/ 04 июля 2011

Просматривая какой-то устаревший код, я обнаружил довольно необычную конструкцию (по крайней мере для меня):

#define loop(i,start,stop) for((i)=(start);(i)<(stop);(i)++)

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

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

Ответы [ 4 ]

6 голосов
/ 04 июля 2011

Стандартная предостерегающая история против макросов - это аргументы с побочными эффектами:

loop(i, x, y++)
2 голосов
/ 04 июля 2011

Хотя я бы не советовал этого, потому что это делает код запутанным и менее читаемым (без фактического упрощения), в этом нет ничего технически неправильного.При правильном использовании это не должно вызывать каких-либо проблем или непреднамеренного поведения.Конечно, если приводятся странные аргументы, упомянутые в одном из других ответов, возникнут проблемы.

1 голос
/ 04 июля 2011

НЕДОПУСТИМО, чтобы быть опасным, но при неправильном использовании он может сделать что-то другое, чем вы ожидаете. Дело в том, что макросы выполняют замену ТЕКСТА - им нужно проверить код до того, как синтаксический анализатор его увидит. Это означает, что если вы делаете что-то в «i», которое имеет побочные эффекты, то все, что вы сделали, будет реплицировано 3 раза, и это может быть не тем, что вы хотите.

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

Лично я бы не использовал его, потому что согласен, что это ничего не упрощает.

0 голосов
/ 04 июля 2011

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

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