【问题标题】:Warning for a cast from a char literal to a char *从 char 字面量转换为 char * 的警告
【发布时间】:2017-11-02 03:13:31
【问题描述】:

我在 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:

[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 中为此打开警告?

【问题讨论】:

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


    【解决方案1】:

    Visual Studio 2015 只允许使用 '\0' 的 const 值进行这种转换。例子:

    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) 右值,其计算结果为零。一个空 指针常量可以转换为指针类型;结果为该类型的空指针值,可区分 从指向对象的指针或指向函数类型的指针的每个其他值。两个相同类型的空指针值应 比较相等。 将空指针常量转换为指向 cv 限定类型的指针是一次转换, 而不是 指针转换后跟限定转换 (4.4) 的序列。

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

    有五种有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int”。

    这在后来的草稿中进行了更改。在 2013 年的 N3690 草案中,第 4.10 节说:

    空指针常量是一个整数文字 (2.14.2),其值为 0 或 std::nullptr_t 类型的纯右值。 空指针常量可以转换为指针类型;结果是该类型的空指针值 并且可以与对象指针或函数指针类型的所有其他值区分开来。这样的转换 称为空指针转换。相同类型的两个空指针值应比较相等。 该 将空指针常量转换为指向 cv 限定类型的指针是单次转换, 而不是 指针转换后跟限定转换 (4.4) 的序列。

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

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

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

    感谢@EricPostpischil 的帮助。

    【讨论】:

      猜你喜欢
      • 2011-11-20
      • 2012-09-09
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多