Можете ли вы использовать # определенные значения в операторах if (в программах на C)? - PullRequest
1 голос
/ 01 мая 2010

Я новичок в программировании на Си. Я думал, когда вы набираете что-то вроде #define Const 5000, компилятор просто заменяет каждый экземпляр Const на 5000 во время компиляции. Это неправильно? Я пытаюсь сделать это в моем коде, и я получаю синтаксическую ошибку. Почему я не могу это сделать?

#define STEPS_PER_REV 12345

... in some function
if(CurrentPosition >= STEPS_PER_REV)
{
    // do some stuff here
}

Компилятор жалуется на оператор if с синтаксической ошибкой, которая не дает мне никаких подробностей.

Ответы [ 6 ]

12 голосов
/ 01 мая 2010

люди в комментариях правы. У вас почти наверняка есть точка с запятой в конце вашего #define. Это означает, что ваше назначение становится:

CURRENT_POSITION = 12345;;

(при условии, что в конце строки была точка с запятой ...)

но ваш if становится:

if(CurrentPosition >= 12345;)

, что, конечно, неверно.

запомните, #defines НЕ являются C-кодом. Им не нужны точки с запятой.

2 голосов
/ 01 мая 2010

Ваш фрагмент кода правильный. #define - это буквально подстановка строк (с немного большим интеллектом).

Вы можете проверить, что препроцессор делает в gcc, используя опцию -E, которая выведет код после запуска препроцессора.

0 голосов
/ 01 мая 2010

# define в c - макросы, они используются препроцессором c для их замены при обнаружении. Например, в вашем исходном коде

 **#define MAX_VALUE 500**

*if( reservations < **MAX_VALUE** )*
{
    ......
}

will be become into

*if( reservations < **500**)*
{
        ......
}

после этапа предварительной обработки. Чтобы их можно было использовать в логических выражениях в предложениях if.

0 голосов
/ 01 мая 2010

Да, но это должно быть const, а не макрос. Вы, вероятно, получаете неправильный тип в вашем сравнении.

0 голосов
/ 01 мая 2010

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

0 голосов
/ 01 мая 2010

Вы правы в том, что препроцессор C просто заменит STEPS_PER_REV на 12345. Так что ваш оператор if выглядит хорошо, основываясь на коде, который вы предоставили.

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

...