Скобки делаются в операторах C/Embedded C #define

В .h-файле для cc2640 mcu я увидел следующее:

#define ADC_STATUS_SUCCESS         (0)

Насколько я знаю C, компилятору предлагается помещать значение ADC_STATUS_SUCCESS везде, где оно встречается, то есть (0). Но какая разница, если поставить только 0?


person jkbs1337    schedule 17.01.2020    source источник
comment
Почти никакой разницы. Но рассмотрите крайний случай, такой как sqrt ADC_STATUS_SUCCESS;, и подумайте, что произойдет в каждом случае.   -  person Eugene Sh.    schedule 17.01.2020
comment
Отвечает ли это на ваш вопрос? Использование скобок в операторах определения препроцессора   -  person The_Average_Engineer    schedule 17.01.2020
comment
спасибо Евгений и Бастьен, это интересно! Но: что подумает программист, если он поставит скобки на единственное значение? Имеет ли это хоть какой-то смысл? Так что, может быть, мой вступительный вопрос должен быть более конкретным: что скобки делают со значениями в этом контексте? или что-то вроде того. Я предполагаю, что это не более того, как подразумевал Юджин, на самом деле это не имеет никакого смысла для значения и предлагает дополнительную функциональность, которой просто нет.   -  person jkbs1337    schedule 17.01.2020
comment
Я бы предпочел задаться вопросом, почему они использовали макросы для представления констант, когда настоящие константы легко доступны. Кроме того, вы иногда видите, как люди пишут return(0); в своих программах, поэтому иногда они просто не думают и/или копируют плохие привычки у других.   -  person Ulrich Eckhardt    schedule 17.01.2020
comment
@UlrichEckhardt Ну, магические числа - это плохо.   -  person Eugene Sh.    schedule 17.01.2020
comment
@ЕвгенийШ. Я думаю, что они имеют в виду ключевое слово const c99.   -  person Federico klez Culloca    schedule 17.01.2020
comment
Я даже не имел в виду, что с return(0) примером плохого кода я имел в виду скобки. Но я бы выбрал static uint32_t const adc_status_success = 0; для определения константы.   -  person Ulrich Eckhardt    schedule 17.01.2020
comment
@UlrichEckhardt Хорошо, я неправильно истолковал ваш комментарий.   -  person Eugene Sh.    schedule 17.01.2020


Ответы (1)


какая разница ставить только 0?

Нет, если вы не пишете сумасшедший код. Обычно для макросов, содержащих выражения, используются круглые скобки, чтобы избежать непредвиденных ошибок, связанных с приоритетом операторов и подобными вещами при их использовании. Однако в этом случае определение чего-то как 0 или как (0) одинаково, если оно используется в выражениях.

Что я подразумеваю под «сумасшедшим кодом»? Ну, единственную разницу между ними можно увидеть примерно в следующем:

void func(int x) { /* ... */ };

#define ADC_STATUS_SUCCESS 0
func ADC_STATUS_SUCCESS;       // INVALID

#define ADC_STATUS_SUCCESS (0)
func ADC_STATUS_SUCCESS;       // VALID (for the love of God NEVER do this)

Я очень сомневаюсь, что это так, никто в здравом уме не стал бы писать такую ​​мерзость. Это определение, скорее всего, по привычке.

person Marco Bonelli    schedule 17.01.2020