指针与无效字符合法的比较

Comparison between pointer and null character legal?

本文关键字:比较 字符 无效 指针      更新时间:2023-10-16

是否将指针与''合法进行比较?

在clang (25836be2c)的中继版本上

const char *a = "foo";
if(a == '')

给出一个错误:指针和整数之间的比较('const char *'and'int')

if(a == 0)

没有预期的任何错误。

null字符是否等于与指针进行比较的空指针?这是编译器错误吗?

另一点是,此错误不会以" -std = C 03"标志出现,而是以" -std = C 11"标志出现。但是,当我使用G (v4.8.5)

时,我都不会在两个标准中都有错误

这是从C 03到C 14的变化。在C 03中,[Cons.ptr] P1说:

无效的指针常数是整数类型的整体常数表达式RVALUE,它评估为零。

字符文字是一个整体常数表达式。

在C 14中,[cons.ptr] p1说:

null指针常数是一个整数文字,具有零值或类型std :: nullptr_t。

字符文字不是整数字面的,也不是std::nullptr_t类型。

最初发布的C 11版本不包含此更改;但是,它是由于缺陷报告DR903而引入的,并将其纳入2013年1月以后的某个时候(关于该博士的最后一个评论的日期)。

由于更改是DR的结果,因此编译器将其视为现有标准的错误即将,而不是下一个标准的一部分,因此Clang和GCC都在-std=c++11时都会改变行为,而不仅仅是-std=c++14。但是,显然直到第4.8版之后才在GCC中实现此更改。(具体来说,它似乎仅在GCC 7及以上实现。)

来自[cons.ptr]§1:

a null指针常数是一个具有零值或类型 std​::​nullptr_­t的prvalue的整数文字。[...]

''不是整数字面的,它是字符字面的,因此转换不适用。