gcc conditional compilation

放肆的年华 提交于 2019-12-22 06:36:03

问题


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!


回答1:


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.




回答2:


-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.




回答3:


-d defines a symbol. I believe most compilers will also allow to assign a value to symbol, as in -dfoo=bar assigns bar to foo symbol.

From http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options

-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.



来源:https://stackoverflow.com/questions/6338244/gcc-conditional-compilation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!