Precedence of -D MACRO and #define MACRO

后端 未结 5 659
情歌与酒
情歌与酒 2021-01-11 14:24

If I have a C file foo.c and while I have given -DMACRO=1 as command line option for compilation. However, if within the header file also I hav

5条回答
  •  暖寄归人
    2021-01-11 15:12

    The command line options apply ahead of any line read from a file. The file contents apply in the order written. In general, you will get at least a warning if any macro is redefined, regardless of whether the command line is involved. The warning may be silenced if the redefinition doesn't matter, perhaps because both definitions are identical.

    The right way to answer a question like this is to build a small test case and try it. For example, in q3965956.c put the following:

    #define AAA 2
    AAA
    

    and run it through the C preprocessor, perhaps with gcc -E:

    C:>gcc -DAAA=42 -E q3965956.c
    # 1 "q3965956.c"
    # 1 ""
    # 1 ""
    # 1 "q3965956.c"
    q3965956.c:1:1: warning: "AAA" redefined
    :1:1: warning: this is the location of the previous definition
    
    2
    
    C:>
    

    You can see from the output that the macro expanded to the value given by the #define in the file. Furthermore, you can see from the sequence of # directives that built-in definitions and the command line were both processed before any content of line 1 of q3965956.c.

提交回复
热议问题