$cat macros.c #ifdef MACRO # error MACRO is defined #else # error MACRO is undefined #endif #if MACRO # error MACRO is non-zero #else # error MACRO is zero #endif
以下的预期产量是多少?
$gcc -c macros.c $gcc -DMACRO -c macros.c $gcc -DMACRO=0 -c macros.c
答:这是我机器上gcc的预处理器.
$gcc -c macros.c macros.c:4:4: error: #error MACRO is undefined macros.c:9:4: error: #error MACRO is zero $gcc -DMACRO -c macros.c macros.c:2:4: error: #error MACRO is defined macros.c:7:4: error: #error MACRO is non-zero $gcc -DMACRO=0 -c macros.c macros.c:2:4: error: #error MACRO is defined macros.c:9:4: error: #error MACRO is zero $
课程:#ifdef即使定义的值为0(零),MACRO也会对定义的内容求值为true.
另一个C预处理器了!这是按照C标准应该如何吗?
解决方法
3) Preprocessing directives of the forms
# if constant-expression new-line group
opt
# elif constant-expression new-line group
opt
check whether the controlling constant expression evaluates to nonzero.
4) Prior to evaluation,macro invocations in the list of preprocessing tokens that will become
the controlling constant expression are replaced (except for those macro names modified
by thedefined
unary operator),just as in normal text. If the tokendefined
is
generated as a result of this replacement process or use of thedefined
unary operator
does not match one of the two specified forms prior to macro replacement,the behavior is
undefined. After all replacements due to macro expansion and thedefined
unary
operator have been performed,all remaining identifiers (including those lexically
identical to keywords) are replaced with the pp-number 0,and then each preprocessing
token is converted into a token. […]
所以,例如,像这样的表达式:
#if !FOO
如果FOO未定义,将评估为1,因为它将被视为0,然后!FOO将被评估为!0,即1.
原文地址:https://www.jb51.cc/c/115077.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。