Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gcc conditional compilation

I'm learning about conditional compilation and I think that I understand it well so far. Now, if I have the code:

 #ifdef UMP_TO_FILE
    //do something here...
 #endif

and I run:

 gcc myprogram.c -DUMP_TO_FILE

Then, the code block "//do something here..." gets compiled. Now, my question is:

What exactly the -DUMP_TO_FILE flag does?

I think that the flag is "-D" and it defines the macro "UMP_TO_FILE", but I want to be sure of the syntaxis and "gcc --help" does not tell me anything about this and maybe I don't know how to search for this on the Internet!!

Thank you very much for sharing your knowledge!

like image 804
Christian Wagner Avatar asked Jun 14 '11 01:06

Christian Wagner


2 Answers

The output of man gcc contains this little snippet:

-D name

Predefine name as a macro, with definition 1.

-D name=definition

The contents of definition are tokenized and processed as if they appeared during translation phase three in a #define directive. In particular, the definition will be truncated by embedded newline characters.

If you are invoking the preprocessor from a shell or shell-like program you may need to use the shell's quoting syntax to protect characters such as spaces that have a meaning in the shell syntax.

If you wish to define a function-like macro on the command line, write its argument list with surrounding parentheses before the equals sign (if any). Parentheses are meaningful to most shells, so you will need to quote the option. With sh and csh, -D'name(args...)=definition' works.

-D and -U options are processed in the order they are given on the command line. All -imacros file and -include file options are processed after all -D and -U options.

So, the option -DUMP_TO_FILE is equivalent to putting the line #define UMP_TO_FILE 1 in your source code (there are subtle differences but there's no need to cover them here).


As an aside, I consider this rather bad practice. The author is performing trickery so that it looks like a compiler option DUMP_TO_FILE rather than a pre-processor macro. That's sort of clever but it's going to cause trouble for anyone looking at the source wondering what UMP_TO_FILE actually means.

Personally, I'd rather see -DDUMP_TO_FILE and #ifdef DUMP_TO_FILE since it's much clearer in intent.

like image 78
paxdiablo Avatar answered Oct 05 '22 18:10

paxdiablo


-D UMP_TO_FILE

Defines the macro value UMP_TO_FILE. It's like to put in your code the following line:

#define UMP_TO_FILE

If the value (UMP_TO_FILE) is defined, the the lines of code between #ifdef and #endif will be compiled. Otherwise not.

like image 31
Heisenbug Avatar answered Oct 05 '22 17:10

Heisenbug