Макросы в Си .... дайте пожалуйста решение - PullRequest
0 голосов
/ 07 апреля 2010

Предположим, я объявил имя макроса как угодно, xyz().

Теперь я создаю другой макрос xyz1() и ссылаюсь на 1-й макрос, т.е. xyz() во 2-м.

Наконец, я создам еще один макрос xyz2() и со ссылкой на второй макрос буду ссылаться на третий.

Теперь мой вопрос: правильно ли это (выполняется без проблем)? Макрос xyz() определяется дважды. Почему это не дает ошибку? Какое решение?

Ответы [ 2 ]

2 голосов
/ 07 апреля 2010

Нет, первый макрос будет определен только один раз.Когда вы пишете

#define Symbol SymbolResolution

, препроцессор заменит Symbol на SymbolResolution везде, где он видит Symbol.Если SymbolResolution является #define или содержит некоторые символы, которые имеют #define внутри, то же самое произойдет с ними - все они будут заменены.Это будет происходить до тех пор, пока во всем блоке перевода не будет символов с #define s.

Таким образом, вы можете ссылаться на макросы из других макросов по своему желанию.Однако вы не можете ссылаться на макросы рекурсивно.Вы также должны быть осторожны с этим - это может легко привести к множеству едва читаемого и очень трудного для отладки кода, если вы неправильно используете макросы.

1 голос
/ 07 апреля 2010

Если вы имеете в виду макросы, ссылающиеся на другие макросы, то это законно.

Когда препроцессор раскрывает макрос имя, расширение макроса заменяет вызов макроса, затем расширение проверяется на наличие большего количества макросов расширить.

#define hello() (12)
#define test() (1+hello())

Однако сам по себе макрос не разрешен

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

...