Is there a good reason for always enclosing a define in parentheses in C? Is there a good reason for always enclosing a define in parentheses in C? c c

Is there a good reason for always enclosing a define in parentheses in C?


Yes. The preprocessor concatenation operator (##) will cause issues, for example:

#define _add_penguin(a) penguin ## a#define add_penguin(a) _add_penguin(a)#define WIDTH (100)#define HEIGHT 200    add_penguin(HEIGHT) // expands to penguin200add_penguin(WIDTH)  // error, cannot concatenate penguin and (100) 

Same for stringization (#). Clearly this is a corner case and probably doesn't matter considering how WIDTH will presumably be used. Still, it is something to keep in mind about the preprocessor.

(The reason why adding the second penguin fails is a subtle detail of the preprocessing rules in C99 - iirc it fails because concatenating to two non-placeholder preprocessing tokens must always result in a single preprocessing token - but this is irrelevant, even if the concatenation was allowed it would still give a different result than the unbracketed #define!).

All other responses are correct only insofar that it doesn't matter from the point of view of the C++ scanner because, indeed, a number is atomic. However, to my reading of the question there is no sign that only cases with no further preprocessor expansion should be considered, so the other responses are, even though I totally agree with the advice contained therein, wrong.


Sometimes you have to write code not with the current caveats in mind, but with the ones of next time it is going to be edited.

Right now your macro is a single integer. Imagine someone editing it in the future. Let's say they are not you, but someone who is less careful or in more in a hurry. The parentheses are there to remind people to put any modifications within them.

This kind of thinking is a good habit in C. I personally write code in a style which some people might find "redundant", with things like this but especially with regards to error handling. Redundancy is for maintainability and composability of future editings.


As Blagovest Buyukliev said:

The define consists of a single token (one operand only, no operators), the parentheses are not needed because a single token (such as 100) is an indivisible atom when lexing and parsing.

But I would recommend the following rules when it comes to macros:

  1. Avoid function like macros @see Lundin's comment.

If you want to use function like macros badly consider the following 2 rules:

  1. Always use brackets for arguments in macros
  2. Only use an macro argument once

Why rule 1.? (To keep the order of the operations correct)

#define quad(x) (x*x)int a = quad(2+3);

will expand to:

int a = (2+3*2+3);

Why rule 2.?(To ensure a side effect is only applied once)

#define quad(x) (x*x)int i = 1;int a = quad(i++);

will expand to:

int a = i++ * i++;