从char字面到char *

时间:2017-11-02 03:13:32

标签: c++ visual-studio compiler-warnings

我在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中为此启用警告?

1 个答案:

答案 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的帮助。

相关问题