Это ошибка препроцессора gcc? - PullRequest
3 голосов
/ 03 сентября 2011
#define BINARY_TREE_PARENT_CORRECT(son, parent) ((son) ? (son->parent == parent) : 1)

Оказывается, что parent в son->parent, что означает, что элемент структуры также будет заменен на parent в son, parent.

Версия gcc 4.1.2.

Как вы думаете, это ошибка или ожидаемое поведение?

Ответы [ 3 ]

2 голосов
/ 03 сентября 2011

Поведение правильное.Все не цитируемые вхождения parent подставляются.Препроцессор не пытается угадать, что вы имеете в виду.Это просто заменяет то, что вы говорите.

1 голос
/ 06 марта 2012

Простое исправление: измените имя параметра, чтобы оно отличалось от имени вашего элемента.

#define BINARY_TREE_PARENT_CORRECT(son, par) ((son) ? (son->parent == par) : 1)

cpp не будет совпадать с параметром родительского, поэтому вы получите ожидаемое поведение.

1 голос
/ 03 сентября 2011

Это ожидаемое поведение.Препроцессор не знает синтаксиса C (кроме случаев, когда вычисляется управляющее выражение в #if) - он просто заменяет токены.

...