Подтвердить что ты не робот

В чем разница между макросом препроцессора без аргументов и значением с нулевыми аргументами

Есть ли какие-либо основания предпочесть

#define MY_MACRO() ..stuff..

to

#define MY_MACRO ..stuff..

Не использовать макросы не является допустимым ответом...

4b9b3361

Ответ 1

Замена происходит только для функционально-подобного макроса, если за именем макроса стоит левая скобка. Таким образом, следующие все вызовут функционально-подобный макрос MY_MACRO():

MY_MACRO()
MY_MACRO ( )
MY_MACRO
( )

Но это не так:

MY_MACRO SomethingElse

Это зависит от того, как вы используете макрос и для чего он используется для того, важно это или нет. В идеале, ваши макросы будут иметь разные имена; если вы зарезервируете идентификаторы всех верхних регистров для макросов, то не имеет значения, используете ли вы объект-подобный или функционально-подобный макрос с нулевыми параметрами.

Эстетически, обычно (но не всегда) очиститель не имеет функциональных макросов, которые принимают нулевые параметры.

Ответ 2

Я предпочитаю использовать MY_MACRO() с круглыми скобками, потому что это больше похоже на то, что я вызываю функцию. В противном случае, похоже, я вызываю константу:

MY_MACRO();

против

MY_MACRO;

То есть, если определение используется для вызова кода, а не просто для простого постоянного значения.

Ответ 3

Макро (x) предпочтительнее, когда у вас есть параметры для передачи. Если вы делаете простую "замену", то IMO, ее предпочтительнее использовать #define BLAH...