2016-07-28 3 views
-4

Я преподаю себе язык C, читая книгу C by example Грегом Перри, и я только что закончил главу 6 «Директивы препроцессора». В конце каждой главы есть упражнения для завершения (чтобы убедиться, что вы понимаете, о чем идет речь и как ее применять).Это лучший способ использовать #define?

Я нахожусь в 4-м упражнении для изучения главы 6, и мне было интересно, правильно ли это сделать? (Упражнение написано в верхней части изображения.)

The code I wrote for the exercise

Мой вопрос: Является ли это лучший способ выполнить упражнение, или есть более простой способ, который является гораздо более эффективным?

+8

Почтовый код, а не изображение вашего кода. – melpomene

+2

Короткий ответ: нет. –

+2

Ознакомьтесь с http://codereview.stackexchange.com/. – melpomene

ответ

1

Лучший способ использовать #define это в качестве примера возможностей, которые больше не должны быть использованы :)

Но если вы настаиваете на использовании #define, вы должны помнить, что расширение макроса не уважать макросов границы. Он просто вставляет токены во входной поток. Поэтому вы всегда должны окружать выражения круглыми скобками, и если макрос принимает аргументы, вы должны окружать их круглыми скобками.

В вашем случае:

#define TOTAL (NO0 + NO1 + NO2 + NO3 + NO4 + NO5 + NO6 + NO7 + NO8 + NO9) 

Если вы не сделаете этого, то вы будете удивлены результатом, например, TOTAL/10, что с определением приведет к 36 вместо из ожидается 4.

Аналогично:

#define SQUARE(x) x * x 

не даст правильный результат, если вы это называете, как, например, SQUARE(y + 1). Вы должны использовать:

#define SQUARE(x) ((x) * (x)) 

и даже тогда вы обнаружите, что может быть сюрпризом, если вы это называете, как SQUARE(y++).

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

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