This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F280049C:器件头文件不会将 char16_t 解析为无符号短整型、从而中断 UTF-16 字符串常量

Guru**** 2540720 points
Other Parts Discussed in Thread: C2000-CGT

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1550450/tms320f280049c-device-header-files-do-not-resolve-char16_t-to-unsigned-short-breaking-utf-16-string-constants

器件型号:TMS320F280049C
主题中讨论的其他器件:C2000-CGT

工具/软件:

根据 C11 标准、以下初始化应有效:

#include
#include
const char16_t abc[]= u“这应该可以正常工作而不会发出警告。\n“;

但当我尝试编译它时、会收到以下警告:

$../c2000-cgt/bin/cl2000 --C11 -I./c2000-cgt/include test.c
“test.c",“,第、第 3 行:错误:类型为“unsigned short [54]“的值不能用于初始化类型为“const char16_t []“的实体
1 在编译“test.c"时“时检测到错误。

>>编译失败

根本原因是、如果我们按照 typedef 链通过 minest_uint16_t 返回_uint16_t、则我们发现对于 CLA、定义正确、为 unsigned short;但对于 C2000、定义错误为 unsinged int。  即使这些是相同的东西,编译器恨生命和放弃。

我可以通过按如下方式对代码进行修改来使此代码正常工作:

#include
#include
const char16_t * abc =(char16_t *) u“这应该可以正常工作而不会发出警告..\n“;

虽然这种编译没有错误、但我无法再使用 sizeof (abc)、因为它现在只是一个指针。  因此、似乎无法初始化 char16_t 数组。

如果我执行不可讲操作并将 minor_uint16_t 的定义强制为 unsigned short (include/machine__types.h)、而不是 unsigned int、则 lo 不详、原始示例的编译没有错误。  我不知道当我这样做时还有什么中断、但我只是想证明这是根本原因。

因此、编译器显然会将 u“这是 UTF-16 文本“解析为 unsigned short、但 char16_t 解析为 unsigned int。  具有讽刺意味的是、它们的大小相同、但其中一个有意为 16 位整数、另一个恰好为该大小;它们并不相同。

char16_t 类型唯一问题的时间是定义 UTF-16 字符串、因此我建议 u“asdf"解“解析为 unsigned int、或者 minster_uint16_t 应解析为 unsigned short。  为什么在地球上不会呢?

是否有其他语法可以用于定义 UTF-16 字符串?  一个神奇地使其工作的编译器选项?  在包含任何系统头文件和 typedef unsigned short char16_t 之前、是否安全?

请提供任何指导。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我可以确认这是有效的:

    #define _CHAR16_T_STATED
    typedef unsigned short char16_t;

    #include
    #include
    const char16_t abc[]= u“这应该可以正常工作而不会发出警告。\n“;

    它是有效的,但它是可取的吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jay:

    让我看看这个、然后回到您那里。

    此致、

    Delaney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jay:

    很抱歉耽误你的时间。  

    请注意、对于 C28x CPU、int 是一个 16 位值、与 CLA 上的短整型值大小相同:

    我将请编译器专家对此进行更多评论。

    此致、

    Delaney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您告知我们这个问题、并提供了一个简明的测试案例。  我可以重现相同的结果。  我提交了条目 EXT_EP-12834 以对其进行调查。  欢迎点击这个链接。

    您建议的解决方法看起来很好。  请考虑另一个问题。

    #ifdef __TMS320C2000__
    typedef unsigned short wa_char16_t;
    #else
    typedef char16_t wa_char16_t;
    #endif

    应用 wa_char16_t 您当前使用的任何地方 char16_t 。  。 代表权变措施。  预处理器名称  __TMS320C2000__ 由 C2000 编译器预定义。  添加引用此论坛主题的长注释。

    谢谢。此致、

    -乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    欢迎您拒绝我标记为“已解决“的回复。  但在我能够进一步答复之前,我需要知道你为什么拒绝它。   

    我将回复标记为已解决的部分原因将 在此论坛帖子的第一个常见问题解答中进行解释。

    谢谢。此致、

    -乔治