【发布时间】:2011-10-31 23:10:42
【问题描述】:
编程实践这本书说:
函数宏最严重的问题之一是一个参数 在定义中出现多次可能会被多次评估;如果 调用中的参数包含具有副作用的表达式,结果是一个微妙的错误。 此代码尝试执行以下字符测试之一:
#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
请注意,参数 c 在宏的主体中出现了两次。如果我叫我吃晚饭 在这样的背景下,
while (isupper(c = getchar()))
那么每次输入字符大于等于A时, 丢弃并读取另一个字符以针对 Z 进行测试。
我不明白如何丢弃大于 >= A 的字符。
【问题讨论】:
-
注意问题可以通过
#define isupper(c) ((unsigned)(c)-'A'<='Z'-'A')修复
标签: c function c-preprocessor