Цель c: использование значений констант #define в математических выражениях - PullRequest
4 голосов
/ 23 января 2012

Я новичок в разработке для iPhone, и я просто пробую некоторые простые процедуры рисования, и у меня возникают проблемы с использованием определенных значений в простой математике.

У меня есть такая строка:

int offset = (((myValue - min_value) * 6) - middle);

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

Поэтому я решил определить константу с помощью #define:

#define WIDTH_OFFSET 6;

тогда я мог бы использовать:

int offset = (((myValue - min_value) * WIDTH_OFFSET) - middle);

однако - при этом возникает ошибка компилятора: «Ожидаемое выражение».

Я могу обойти это, разбив вычисление на несколько строк:

int offset = myValue - min_value;
offset = offset * WIDTH_OFFSET;
offset = offset - middle;

Компилятор считает, что это нормально.

Полагаю, здесь есть какая-то неявная приведение или какая-то другая языковая функция - кто-нибудь может мне объяснить, что происходит?

Ответы [ 4 ]

14 голосов
/ 23 января 2012

Удалить точку с запятой ; после #define:

#define WIDTH_OFFSET 6

#define буквально подставляет свои аргументы, поэтому ваше выражение после предварительной обработки становится

(((myValue - min_value) * 6;) - middle);

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

С другой стороны, ваше другое выражение

int offset = myValue - min_value;
offset = offset * WIDTH_OFFSET;

не представляет такой проблемы, поскольку наличие двухточки с запятой в строке как в

 offset = offset * 6;;

синтаксически допустимы.

4 голосов
/ 23 января 2012

Когда вы #define что-то, где вы используете, это точно так же, как если бы вы набрали это в себе там.Поэтому, где вы используете WIDTH_OFFSET, вы получаете 6;на его месте - что, конечно, не является вашим намерением.Так что просто удалите точку с запятой.

2 голосов
/ 23 января 2012

По сути, макросы - это удобные функции, которые препроцессор помещает в строку. Таким образом, вы можете думать, что они делают копирование / вставку для соответствующих записей, в вашем случае это заменит любое вхождение WIDTH_OFFSET на 6;, поэтому, как и другие говорили, удалите точку с запятой ;, и все готово.

Кроме того, при определении макросов для простых математических функций не забудьте поместить их в скобки ( и ), в противном случае вы можете получить некоторые ошибки порядка математических операций (например, непреднамеренное умножение частей перед добавлением)

2 голосов
/ 23 января 2012

Как сказал dasblinkenlight, удалите точку с запятой.Объяснение этому заключается в том, что #defines - это буквальная замена вашего кода.Таким образом, с точкой с запятой ваш неверный код читается:

int offset = (((myValue - min_value) * 6;) - middle);

Рабочий код читается:

offset = offset * 6;;

Что синтаксически отлично как;фактически представляет собой пустую «строку» кода.

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