【发布时间】:2017-02-09 04:07:01
【问题描述】:
在[7.1.4 库函数的使用]中,我读到:
在头文件中声明的任何函数都可以另外实现为 头文件中定义的类函数宏...
和
对作为宏实现的库函数的任何调用 应扩展为仅对其每个参数进行一次评估的代码...
那么对于getc,[7.21.7.5的getc函数]:
getc 函数等价于 fgetc,除了如果它是 实现为宏,它可能会多次评估流,因此 参数永远不应该是带有副作用的表达式。
getc的定义是否:
- 与库函数定义相矛盾?
- 反过来呢?
- 这是标准的不一致吗?
- 或者这是否意味着如果
getc被单独实现(似乎不符合但?)作为宏,它可能会对其参数进行两次评估?
【问题讨论】:
-
@Olaf 不明白你的意思... getc(*f++) 是否安全?好的,可能不安全,但与 7.1.4 相矛盾。我错了吗?
-
嗯,我可能在阅读不存在的标准(“流”)时添加了一个“the”(刚刚检查了标准,
stream是参数的名称)。再想一想,它可能确实意味着指针本身。我想说 7.1.4 仅适用于不需要是宏但可能是函数的名称。这样可以保证相同的行为,而无需关心它是宏还是函数。它不适用于有保证的宏。只是不要有争论的副作用,应该不是太大的问题。 -
当然这不是一个真正的问题,因为很少有边框效果作为参数。无论如何阅读std,我知道getc是一个函数(“getc函数”),所以7.1.4适用,“另外实现为类似函数”+“如果它被实现为宏”导致我与“评估”不一致一次”和“可能评估不止一次”。 std 提示确保函数调用:
(getc)(arg). -
顾名思义,它是一个“类函数宏”。但请随时向 C 工作组提交缺陷报告。那么,可能已经有一个了。你检查了吗?
-
没有缺陷报告;任何对此提交缺陷的尝试都将立即被拒绝。
标签: c function macros language-lawyer libc