警告从char文字转换为char*

Warning for a cast from a char literal to a char *

本文关键字:char 转换 文字 警告      更新时间:2023-10-16

我在Visual Studio中找不到以下内容的警告。我打开了/墙,但仍然一无所获:

const char * pointer = '';

gcc不会为C++11、C++14或C++17:编译它

[x86-64 gcc 7.2#1]错误:从"char"到"const char*"的转换无效[-fpermission]

gcc将在编译时使用以上内容作为警告,如果我通过-fpermissive:

[x86-64 gcc 7.2#1]警告:从"char"到"const char*"的转换无效[-fpermission]

clang不会编译C++11、C++14或C++17:

[x86-64 clang 5.0.0#1]错误:无法用'char'类型的右值初始化'const-char*'类型的变量

我之所以这么问,是因为下面的代码最终出现在我们的代码库中,显然没有任何警告:

std::ofstream file;
//...
file.write('', 20);

有没有办法在Visual Studio中为此打开警告?

Visual Studio 2015只允许常量值为"\0"的转换。示例:

char c = '';
const char cconst = '';
const char * p1 = c;      //error (not even warning)
const char * p2 = cconst; //ok
const char * p3 = '';   //ok
const char * p4 = '1';   //error (not even warning)

具体错误为:

错误:类型为"char"的值不能用于初始化类型为"const char*"的实体

Apple LLVM 8.1.0(clang-802.0.41)使用C++03发出警告,但使用C++11及更高版本发出错误。该行为在2011年2月28日(草案N3242)和2013年5月15日(草案N2690)之间的某个时候发生了变化。我找不到确切的要点。

在C++的早期草案中,如n1905,OP代码被定义为有效的转换:

空指针常量是整数类型的整数常量表达式(5.19)右值,计算结果为零。一个null指针常量可以转换为指针类型结果是该类型的空指针值,并且是可区分的从指向对象的指针或指向函数类型的指针的每隔一个值。两个相同类型的空指针值应比较相等将空指针常量转换为指向cv限定类型的指针是一次转换,而不是指针转换之后是资格转换(4.4)的序列。

3.9.1.2节定义了有符号整数类型:

有五种有符号整数类型:"signed char">、"short int"、"int"、《long int》和"long long int"。

在后来的草稿中对此进行了更改。在2013年的N3690草案中,第4.10节规定:

空指针常量是值为零的整数文本(2.14.2)或std::nullptr_t类型的prvalue。空指针常量可以转换为指针类型结果是该类型的空指针值并且可与对象指针或函数指针类型的每一个其它值区分开。这样的转换称为空指针转换。相同类型的两个空指针值应比较相等将空指针常量转换为指向cv限定类型的指针是一次转换,而不是指针转换后进行资格转换的顺序(4.4)。

character-literal在第2.14.1节中被定义为文字,但在第2.14.2节中没有出现。相反,它有自己的章节——2.14.3。

C++17草案n4659有完全相同的措辞,但在不同的部分。

我看不出有什么方法可以在VS 2015中对此发出警告。这将是运行静态分析工具/其他编译器来捕捉额外警告的另一个原因。

感谢@EricPostpischil的帮助。