Multi-line DEFINE directives?

C++CCompiler Construction

C++ Problem Overview


I am not an expert, so go easy on me. Are there any differences between these two code segments?

#define BIT3 (0x1
<
<
3)
static int a;

and

#define BIT3 (0x1 << 3) static int a;

Also, is there a way to write the first in one line? What is the point of this multi-line style? Is the following code good?

#define BIT3 (0x1 << 3)
static int a;

C++ Solutions


Solution 1 - C++

A multi-line macro is useful if you have a very complex macro which would be difficult to read if it were all on one line (although it's inadvisable to have very complex macros).

In general, you can write a multi-line define using the line-continuation character, \. So e.g.

#define MY_MACRO    printf( \
    "I like %d types of cheese\n", \
    5 \
    )

But you cannot do that with your first example. You cannot split tokens like that; the << left-shift operator must always be written without any separating whitespace, otherwise it would be interpreted as two less-than operators. So maybe:

#define BIT3 (0x1 \
    << \
    3) \
    static int a;

which is now equivalent to your second example.

[Although I'm not sure how that macro would ever be useful!]

Solution 2 - C++

For example:

#define fact(f,n)   for (f=1; (n); (n)--) \
                      f*=n;

You can separate the lines with the \ character. Note that it is not macro specific. You can add the \ character in your code whenever you would like to break a long line.

Solution 3 - C++

The first one should not work. Lines should be separated with backslash THEN newline. Like so:

#define SOME_MACRO "whatever" \
"more" \
"yet more"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdam SView Question on Stackoverflow
Solution 1 - C++Oliver CharlesworthView Answer on Stackoverflow
Solution 2 - C++phoxisView Answer on Stackoverflow
Solution 3 - C++Prof. FalkenView Answer on Stackoverflow