Mil*_*ith 5 c++ compiler-warnings visual-studio
我在Visual Studio中找不到以下警告.我打开/ Wall但仍然一无所获:
const char * pointer = '\0';
Run Code Online (Sandbox Code Playgroud)
gcc不会为C++ 11,C++ 14或C++ 17编译它:
[x86-64 gcc 7.2#1]错误:从'char'到'const char*'的无效转换[-fpermissive]
如果我通过,gcc将使用上面的代码作为警告进行编译-fpermissive:
[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);
Run Code Online (Sandbox Code Playgroud)
有没有办法在Visual Studio中打开此警告?
Visual Studio 2015 仅允许使用 const 值“\\0”进行此转换。例子:
\n\nchar c = \'\\0\';\nconst char cconst = \'\\0\';\n\nconst char * p1 = c; //error (not even warning)\nconst char * p2 = cconst; //ok\nconst char * p3 = \'\\0\'; //ok\nconst char * p4 = \'\\1\'; //error (not even warning)\nRun Code Online (Sandbox Code Playgroud)\n\n具体错误是:
\n\n\n\n\n错误:“char”类型的值不能用于初始化“const char *”类型的实体
\n
Apple LLVM 8.1.0 (clang-802.0.41) 对于 C++03 给出警告,但对于 C++11 及更高版本给出错误。该行为在 2011 年 2 月 28 日(草案 N3242)和 2013 年 5 月 15 日(草案 N3690)之间的某个时间发生了变化。我找不到确切的点。
\n\n在早期的 C++ 草案中,例如 n1905,OP 代码被定义为有效的转换:
\n\n\n\n\n空指针常量是计算结果为零的整数类型的整型常量表达式 (5.19) 右值。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与指向对象的指针或指向函数类型的指针的每个其他值区分开。相同类型的两个空指针值比较相等。空指针常量到 cv 限定类型指针的转换是单个转换,而不是指针转换后跟限定转换 (4.4) 的序列。
\n
第 3.9.1.2 节定义了有符号整数类型:
\n\n\n\n\n有五种有符号整数类型:\xe2\x80\x9csigned char\xe2\x80\x9d、 \xe2\x80\x9cshort int\xe2\x80\x9d、 \xe2\x80\x9cint\xe2\x80\x9d、 \xe2 \x80\x9clong int\xe2\x80\x9d 和 \xe2\x80\x9clong long int\xe2\x80\x9d。
\n
这一点在后来的草案中得到了改变。在 2013 年的 N3690 草案中,第 4.10 节规定:
\n\n\n\n\n空指针常量是一个值为 0 的整数文字 (2.14.2) 或 std::nullptr_t 类型的纯右值。\n 空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与对象指针或函数指针类型的所有其他值区分开。这种转换称为空指针转换。相同类型的两个空指针值比较相等。空指针常量到 cv 限定类型指针的转换是单个转换,而不是指针转换后跟限定转换 (4.4) 的序列。
\n
character-literal是 a 在第 2.14.1 节中定义为文字,但它没有出现在第 2.14.2 节中。相反,它有自己的部分 - 2.14.3。
C++17 草案 n4659 具有完全相同的措辞,但在不同的部分。
\n\n我没有看到在 VS 2015 中对此发出警告的方法。这将是运行静态分析工具/其他编译器来捕获额外警告的另一个原因。
\n\n感谢@EricPostpischil 的帮助。
\n| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |