2016-02-10 2 views
2

Когда это необходимо, чтобы положить целое (правое) выражение макроса определения в скобках?Скобка в определении макросов

Если я что-то вроде

#define SUM(x, y) ((x)+(y)) 

Я должен правильно поставить выражение в скобках, потому что «+» имеет низкий приоритет в C (и это не будет работать, если я хотел бы использовать его в следующий контекст SUM(x, y) * 5U)

Эти скобки все еще требуются, если я использую оператор с наивысшим приоритетом, например

#define F foo() 

или даже

#define ACCESS(x, y) (x)->(y) 

выражение существует, что это нарушило бы фактическое значение, как это будет делать для SUM() примера ли?)

Для правил старшинства я использовал http://en.cppreference.com/w/c/language/operator_precedence

+4

Я не знаю о * необходимо *, но я бы все же назвал это хорошей практикой. Что, если кто-то (скажем) добавляет поправочный коэффициент к макросу 'F' для (независимо) нормализации вывода' foo' и забывает добавить скобки? Вы будете тратить много времени, пытаясь понять, что пошло не так. – Linuxios

+2

Также стоит отметить, что таблица приоритетов, которую вы указываете *, на самом деле не является стандартом языка *, а является более простым в использовании представлением более сложных правил в стандарте. Я не юрист или юрист, но эти правила могут изменить ситуацию. – Linuxios

ответ

2

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

+0

Мой вопрос был, когда это необходимо *, чтобы скопировать круг вокруг макроса. Конечно, если оператор имеет низкий приоритет, например, «+», тогда всегда требуются скобки (например, в примере СУММ). Но как насчет выражений с высоким приоритетом типа «->», «++», «[]», «.» ? – ZzetT

+0

Я думаю, что нашел хороший пример, который показывает, почему «полезно использовать круглые скобки, чтобы избежать больших ошибок». не всегда правильно! Представьте, что у вас '#define foo()' и 'foo' определяется как' do {} while (0) ', после чего это больше не будет компилироваться! – ZzetT

1

Некоторые программисты, использующие простые #defines запишет

#define ZERO (0) 

, который не имеет смысла, кроме усложнять.

На самом деле макрос WYSIWYG так с этим в виду, вы можете решить, какие нужны круглые скобки:

SUM(3,4) => ((3)+(4)) // parentheses around 3 and 4 are not necessary 

RATIO(3+4,4+5) => ((3+4)/(4+5)) // probably necessary here due to operator precedence 

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

+0

Я думаю, что это не отвечает на мой вопрос, вы просто объяснили, как макросы оцениваются в C. – ZzetT

+0

Да, это то, что я только что сделал. Вы считали, что скобки в макросах оцениваются иначе, чем в других операторах С. –

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