【发布时间】:2018-11-07 00:09:21
【问题描述】:
这里是示例代码:
#include <ctype.h>
int main(void)
{
isalpha("X");
}
我的问题是:此代码是否违反约束?等效地,如果不发出诊断,实现是否不合格?
动机: 多个主要编译器不会对此代码发出警告,即使在符合标准的代码中也是如此。 C11 6.5.2.2/2 涵盖了将 char * 传递给原型期望 int 的函数是违反约束的。
但是,我不清楚 7.1.4 中允许将库函数另外定义为宏的规定是否取代了 6.5.2.2/2 的要求。脚注 187 表明宏隐藏了原型,但脚注是非规范性的。
(isalpha)("X"); 代码当然会给出诊断。
【问题讨论】:
-
我可以假设这与this question有关吗?
-
仔细阅读,然后在 7.1.4 中有所关联,我们有“出于相同的句法原因,允许获取库函数的地址,即使它也被定义为宏。 185)”,其中 185 表示“这意味着实现应为每个库函数提供一个实际函数,即使它还为该函数提供了一个宏。”。同样,脚注不是规范性文本。但我想如果
int (*ptr)(int) = isalpha;在不为问题中的代码提供诊断消息的编译器上编译,那么尝试一下会很有趣。 -
如果它编译,那么如果你这样做
int (*ptr)(int) = isalpha; ptr("X");会发生什么。 -
@Lundin 该声明显然会得到函数(没有参数列表时不会替换类似函数的宏)
-
是的,如果您获得了该功能,您将获得检测违反简单分配的诊断能力。我的观点是,如果编译器仍然无法通过函数指针版本产生诊断,那么它肯定是坏的,因为我们可以忽略 7.1.4 所说的任何内容。我首先要做这个测试,检查某个编译器是否符合要求。
标签: c language-lawyer