В чем разница между макросом препроцессора без аргументов и значением с нулевыми аргументами
Есть ли какие-либо основания предпочесть
#define MY_MACRO() ..stuff..
to
#define MY_MACRO ..stuff..
Не использовать макросы не является допустимым ответом...
Ответ 1
Замена происходит только для функционально-подобного макроса, если за именем макроса стоит левая скобка. Таким образом, следующие все вызовут функционально-подобный макрос MY_MACRO():
MY_MACRO()
MY_MACRO ( )
MY_MACRO
( )
Но это не так:
MY_MACRO SomethingElse
Это зависит от того, как вы используете макрос и для чего он используется для того, важно это или нет. В идеале, ваши макросы будут иметь разные имена; если вы зарезервируете идентификаторы всех верхних регистров для макросов, то не имеет значения, используете ли вы объект-подобный или функционально-подобный макрос с нулевыми параметрами.
Эстетически, обычно (но не всегда) очиститель не имеет функциональных макросов, которые принимают нулевые параметры.
Ответ 2
Я предпочитаю использовать MY_MACRO() с круглыми скобками, потому что это больше похоже на то, что я вызываю функцию. В противном случае, похоже, я вызываю константу:
MY_MACRO();
против
MY_MACRO;
То есть, если определение используется для вызова кода, а не просто для простого постоянного значения.
Ответ 3
Макро (x) предпочтительнее, когда у вас есть параметры для передачи. Если вы делаете простую "замену", то IMO, ее предпочтительнее использовать #define BLAH...