我在Visual Studio中找不到以下警告。我打开了/ Wall但仍然一无所获:
const char * pointer = '\0';
gcc不会为C ++ 11,C ++ 14或C ++ 17编译它:
如果我通过[x86-64 gcc 7.2#1]错误:从'char'无效转换为'const char *'[-fpermissive]
-fpermissive
:,gcc将使用上述内容编译作为警告
[x86-64 gcc 7.2#1]警告:从'char'无效转换为'const char *'[-fpermissive]
clang不会为C ++ 11,C ++ 14或C ++ 17编译:
[x86-64 clang 5.0.0#1]错误:无法使用'char'类型的右值初始化'const char *'类型的变量
我问的是因为下面的代码最终出现在我们的代码库中,显然没有任何警告:
std::ofstream file;
//...
file.write('\0', 20);
有没有办法在Visual Studio中为此启用警告?
答案 0 :(得分:1)
Visual Studio 2015仅允许使用const值'\ 0'进行此转换。例子:
char c = '\0';
const char cconst = '\0';
const char * p1 = c; //error (not even warning)
const char * p2 = cconst; //ok
const char * p3 = '\0'; //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日草案(草案N3690))之间的某个时间发生了变化。我找不到确切的观点。
在早期的C ++草案中,例如n1905,OP代码被定义为有效的转换:
空指针常量是整数类型的整数常量表达式(5.19)rvalue,其值为零。空 指针常量可以转换为指针类型; 结果是该类型的空指针值,并且是可区分的 从指针到对象的每个其他值或指向函数类型的指针。两个相同类型的空指针值应该 比较平等。 将空指针常量转换为指向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 draft n4659具有完全相同的措辞,但在不同的部分。
我没有看到在VS 2015中对此发出警告的方法。这是运行静态分析工具/其他编译器以捕获额外警告的另一个原因。
感谢@EricPostpischil的帮助。