以下是示例代码:
#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");
确实给出了诊断。
发布于 2018-05-28 22:23:52
我的解释是,尽管标准要求有一个isalpha
函数,但在7.1.4中,它特别允许实现另外定义一个与隐藏函数声明的名称相同的宏。
这意味着在程序中调用isalpha
(而不是先使用#undef
)可以导致宏展开除文字函数调用以外的内容,而6.5.2.2将需要对其进行诊断。
https://stackoverflow.com/questions/50565677
复制相似问题