Что Deitel и Deitel подразумевают под «выражениями с побочными эффектами, которые нельзя передавать в макрос»? - PullRequest
0 голосов
/ 07 марта 2020

У меня есть эти вопросы о помеченной красным части изображения? Изображение взято из Deitel & Deitel C ++ Приложение E: Препроцессоры

  1. Что означает слово «выражения с побочными эффектами»?

  2. Я думаю, что цель автора состоит в том, что мы не должны изменять значение переменных, существующих в замене макроса, я прав?

  3. Я вообще не понял части, касающейся распространенной ошибки. Можете ли вы объяснить это по коду?

snipped from Deitel & Deitel C++ Appendix E : Preprocessors

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Что это значит, когда мы говорим «Выражения с побочными эффектами»?

Выражения типа ++a. Если у вас есть что-то вроде #define max(a, b) ((a) > (b) ? (a) : (b)) и если вы делаете max(++foo, bar), этот макрос расширяется до (++foo) > (bar) ? (++foo) : (bar), что, возможно, увеличивает foo в два раза.

Я думаю, что цель автора состоит в том, что мы не должны изменять значение переменных, существующих в замене макроса, я прав?

Нет, я не думаю, что это это цель.

на самом деле я совсем не понял об общей ошибке. Можете ли вы объяснить это кодом?

Например, допустим, вы объявили вышеупомянутый макрос max. С этого момента, пока вы не #undef этого макроса, у вас будут проблемы с использованием чего-либо, называемого max. Например, это не скомпилируется: std::numeric_limits<int>::max().

1 голос
/ 07 марта 2020

Выражения с побочными эффектами - это выражения, которые делают что-то иное, чем возвращают значение. Например:

#define PRINT_TWICE(x) std::cout << (x) << "," << (x)
int i = 0;
PRINT_TWICE(i++);

Не печатать 0 дважды, затем установить i в 1, как при вызове функции, будет напечатано 0 и 1, затем установить i в 2.

Часть о Распространенные ошибки означают, например, если я определяю макрос max (как раздражает windows), то когда я пытаюсь вызвать std::numeric_limits<int>::max(), я получаю синтаксическую ошибку, потому что последняя часть будет заменена макросом max. Этого можно избежать с помощью соглашений, таких как использование всех макросов в верхнем регистре, но тогда вы все равно можете столкнуться с кем-то, кто определит константы в качестве верхнего регистра, например.

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