What happens when a C preprocessor macro is defined twice?

我们两清 提交于 2019-12-23 12:19:46

问题


I define a macro twice as follows:

#define a 2  
#define a 3   

I thought any occurrence of a in the code would be replaced by 2, and when #define a 3 is encountered there are no more as are available in the code to be replaced by 3, so the 2 would take precedence.

But when I executed it a was replaced by 3, why?


回答1:


If you define a macro twice like that, the compiler should at least give you warning, if not an error. It is an error.

§6.10.3/2 : An identifier currently defined as an object-like macro shall not be redefined by another #define preprocessing directive unless the second definition is an object-like macro definition and the two replacement lists are identical.

You can redefine a macro by explicitly removing the previous definition:

#define a 2
/* In this part of the code, a will be replaced with 2 */
...

#undef a
#define a 3
/* From here on, a will be replaced with 3 */
...

Macro replacement happens as the file is read, using the macro definitions active at that point in the file, except inside (most) preprocessing directives.

§6.10/7: The preprocessing tokens within a preprocessing directive are not subject to macro expansion unless otherwise stated.

§6.10.3.5/1: A macro definition lasts (independent of block structure) until a corresponding #undef directive is encountered or (if none is encountered) until the end of the preprocessing translation unit.




回答2:


It's not clear to me what you were expecting to see.

The second line overrides the definition of a from the first line.

Any a encountered after that will be replaced by 3.




回答3:


a will not be replaced by 2 in #define a 3 as this is also a pre processor.

After processing #define a 2, the value of a is 2, but it is overwritten by the next statement #define a 3



来源:https://stackoverflow.com/questions/32431033/what-happens-when-a-c-preprocessor-macro-is-defined-twice

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