Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multi-line DEFINE directives?

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; 
like image 444
Adam S Avatar asked Jun 08 '11 15:06

Adam S


People also ask

How do you #define on multiple lines in C++?

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

What is #define directive in C?

The #define creates a macro, which is the association of an identifier or parameterized identifier with a token string. After the macro is defined, the compiler can substitute the token string for each occurrence of the identifier in the source file.

What is multiline macro?

We can write multiline macros like functions, but for macros, each line must be terminated with backslash '\' character. If we use curly braces '{}' and the macros is ended with '}', then it may generate some error. So we can enclose the entire thing into parenthesis.

Why and when we use #define directive?

The #define directive is used to define values or macros that are used by the preprocessor to manipulate the program source code before it is compiled. Because preprocessor definitions are substituted before the compiler acts on the source code, any errors that are introduced by #define are difficult to trace.


1 Answers

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!]

like image 56
Oliver Charlesworth Avatar answered Sep 18 '22 10:09

Oliver Charlesworth