【问题标题】:Setting CHAR16* to a #define string?将 CHAR16* 设置为 #define 字符串?
【发布时间】:2013-06-23 23:44:33
【问题描述】:

我对执行此操作的正确方法有些困惑。我有一个包含字符串的#DEFINE,我有一个我想设置为该字符串的CHAR16*。我将如何正确地做到这一点?我试过了:

#DEFINE MYSTRING "HELLO"

CHAR16* THISONE;

THISONE = MYSTRING;

为什么这不起作用?我希望能够打印出THISONE 中的字符串。我收到有关不兼容类型的编译器警告。我确定我错过了一些小东西?

【问题讨论】:

  • C 还是 C++?它们不一样。
  • 您可能需要 L"HELLO" 或 u16"HELLO" 之类的内容,因为 "HELLO" 是一个窄字符串文字,很可能与 CHAR16* 不兼容。
  • 什么是CHAR16? C 或 C++ 标准没有定义这种类型。而#DEFINE 是语法错误;这是#define
  • 抱歉,我无法将我的真实代码用于 NDA 问题。我正在使用 EDK2 的框架,我应该提到。这是 C。
  • 哦EFI,有时候我真的不想你....

标签: c++ c variable-assignment


【解决方案1】:

您正在定义一个窄字符串文字"HELLO",但尝试使用CHAR16 指针指向它。这不是一个兼容的任务。正如clang 所说:

example.cpp:9:13: error: assigning to 'wchar_t *' from incompatible type
      'const char [6]'
    THISONE = MYSTRING;
            ^ ~~~~~~~~
1 error generated.

(我将类型从 CHAR16 * 更改为 wchar_t *,因为我不在 Windows 上 - 语义相同)。

要修复它,你需要在字符串常量前面添加一个L

#define MYSTRING L"HELLO"

然后它会编译。在 C 中,你完成了。然而,在 C++ 中,您可能仍会收到警告:

example.cpp:9:15: warning: conversion from string literal to 'wchar_t *' is
      deprecated [-Wdeprecated-writable-strings]
    THISONE = MYSTRING;
              ^
example.cpp:3:18: note: expanded from macro 'MYSTRING'
#define MYSTRING L"HELLO"
                 ^
1 warning generated.

将定义改为:

const wchar_t *THISONE;

修复该警告。我猜你的情况是:

const CHAR16 *THISONE;

编辑说明 - 以后请展示您的真实代码。 #DEFINE(大写字母)不是有效的 C 或 C++。

【讨论】:

  • 在哪个平台/编译器上是 n const CHAR16 数组 类型的 narrow 字符串文字?我很困惑。
  • 没有,可能。我说是吗?
  • 不,但我想这可能是 OP 示例中的另一个问题 - 或者不是吗?
  • 是的 - 你可能是对的。我不得不在这里用char * 进行测试,因为我没有窗户。让我试试看……
  • @DyP - 已修复,谢谢。我最初的测试没有意义。我想我现在已经解释了一切。
【解决方案2】:

你可能想要这样的东西:

// Update: As carl points out, there is more to this for wide chars
const CHAR16* THISONE = MYSTRING;

您可以探索更多关于c-strings here 以及within this very site 的信息。

【讨论】:

  • 这是一个问题,但可能不会导致错误。
  • 是的,先生,我突然想到 c++ 中的宽字符也应该更具体:L"mystring",正如 ST3 指出的那样
【解决方案3】:

您可能希望将其分配为全局变量。在这种情况下,您需要:

#define MYSTRING "HELLO"
CHAR* THISONE = MYSTRING;

#define MYSTRING L"HELLO"
CHAR16* THISONE = MYSTRING;

如果赋值是在函数中(main() 或其他),你可以在创建变量的地方进行赋值。

其实我不确定有没有“CHAR16”这样的类型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2016-12-14
    • 1970-01-01
    • 2016-04-29
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多