【问题标题】:Error C2440 when compiling a library with meson用介子编译库时报错C2440
【发布时间】:2022-11-25 16:10:04
【问题描述】:

我有代码 C++,我想将其编译为一个库介子我得到 2 种错误的地方

  • 错误 C2440:“初始化”:无法从“const wchar_t [19]”转换 到'const PWCHAR' -注意:从字符串文字转换会丢失 const 限定符(请参阅 /Zc:strictStrings)
  • 错误 C2664: '... 无法从 'const wchar_t [6]' 转换参数 2' 到 'PWSTR 注意:从字符串文字转换会丢失 const 限定符(请参阅 /Zc:strictStrings)

winnt.h 对 wchar_t 使用 typedef:

typedef wchar_t WCHAR;
typedef WCHAR *PWCHAR;

如果我在我的代码中这样做,我会收到错误 C2440:

const PWCHAR Tokens[] = { L"A", L"B", L"C", L"D" };

如果我更改我的代码,错误就会消失:

 const wchar_t * Tokens[] = { L"A", L"B", L"C", L"D" };

我知道在 C 中,字符串文字的类型是 char 数组,但在 C++ 中,它是导致此错误的 const char 数组。 我也知道可以在 VStudio 中更改 Zc:strictStrings。但是既然我用介子编译我的代码,我该如何使用介子来消除那个错误呢?

【问题讨论】:

标签: c++ compiler-errors typedef meson-build wchar


【解决方案1】:

随着定义

const PWCHAR Tokens[] = { ... };

你声明 Tokens 是一个常量数组指针.这些指针指向的数据是不是持续的。

由于文字字符串是常量,因此您不能使用它们来初始化数组。

工作定义:

const wchar_t * Tokens[] = { ... };

或者替代方案

wchar_t const * Tokens[] = { ... };

您在这里声明 Tokens 是指向常量 wchar_t 数据的(非常量)指针数组。这对于文字字符串是正确的。

如果您想要可移植并遵循 C++ 标准,那么使用 PWCHAR 是根本不可能的。


如果您希望指针本身是常量,则需要为它们添加另一个 const 限定符:

wchar_t const * const Tokens[] = { ... };
//              ^^^^^
//              makes the pointers constant
//      ^^^^^
//      makes the data constant

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2020-03-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多