В чем разница между макросом препроцессора без аргументов и макросом без аргументов - PullRequest
27 голосов
/ 23 ноября 2010

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

#define MY_MACRO() ..stuff..

до

#define MY_MACRO ..stuff..

Не использовать макросы - неверный ответ ...

Ответы [ 3 ]

17 голосов
/ 23 ноября 2010

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

MY_MACRO()
MY_MACRO ( )
MY_MACRO
( )

Но это не будет:

MY_MACRO SomethingElse

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

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

7 голосов
/ 23 ноября 2010

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

MY_MACRO();

против

MY_MACRO;

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

1 голос
/ 23 ноября 2010

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

...