【问题标题】:C/C++ extension for Visual Studio Code "variable "u8"" is not a type name”Visual Studio Code 的 C/C++ 扩展“变量“u8””不是类型名称”
【发布时间】:2020-05-27 05:17:22
【问题描述】:

我正在将 VS Code 用于 Microsoft 的 C/C++ 扩展的嵌入式 C 项目。我有一个给定的类型命名方案,我不负责也无法更改任何内容。

要使用我的名字,例如typedefs

typedef unsigned char u8;
typedef signed char s8;
typedef unsigned short u16;
typedef volatile unsigned long vu32;

当在任何地方使用u8 类型时(即使在 typedef 之后的行中),它​​不会突出显示作为类型名,而 确实会在 typedef 行中突出显示 本身。它被标记为 en error 并带有以下错误消息:

"Variable "u8"" is not a type name.

所有其他类型都可以正常工作。

这似乎不是长度问题,因为s8 类型有效。我尝试将其更改为u7,这样它不应该是开头的“u”,我尝试添加一个像这样的字母:u8e,效果也很好。

我找到了this,当我自己尝试这四个班轮时:

typedef unsigned char u8;
typedef unsigned short u16;
u8 testVar8;
u16 testVar16;

我没有得到错误,所以开始让我更加困惑。

在写这个问题时,我回到了 VS Code 窗口,只是注意到所有红色下划线和所有错误都消失了,但是当我接下来打开 VS Code 时,我遇到了同样的问题。

【问题讨论】:

  • 您遇到的是 VS Code 问题,而不是 C/C++ 问题。您的 typedef 没有任何问题,所以我怀疑您在 typedef 行上方有一个问题,导致语法高亮显示关闭。
  • @DavidC.Rankin u8 是标准字符串文字的 id,他调用了 UB,有点。
  • 嗯,是的,也不是。 u8 文字说明符类似于数字值的 UUL 后缀,它不是左值问题,也不会影响 typedef 标记空间。 C11 Standard - 6.4.5 String literals
  • 在玩弄并将所有内容更改为固定长度的 stdint.h confom 类型之后,结果发现 vs code semms 有一个完全不同的问题,因为它也不喜欢 uint8_t。它可能必须对使用该类型的 typedef 位结构做一些事情。

标签: c++ c visual-studio-code


【解决方案1】:

您的代码仍然可以编译。只是从 C11 开始,u8 后跟一个带引号的字符串表示后面的字符串是用 UTF-8 编码的。还有其他的:UL 特别有害,因为您可以看到它们在优化代码中被用作上层和下层,尤其是从 FORTRAN 转换而来的代码。顺便说一句,这不是语言的重大变化。

这里唯一真正的问题是 MSVC 中的语法高亮显示使用与实际编译器不同的工具集,虽然它是一个令人印象深刻的工具包,但它并不完美。

我个人会将您的 typedef 更改为

typedef uint16_t u16;
typedef volatile unsigned long uint32_t vu32;

着眼于完全删除所有这些(是的,我知道目前这不是一种选择,但你作为程序员的工作之一就是影响)。目前需要调整最终的typedef 才能在典型的 Unix 工具集上正常工作。

【讨论】:

  • u8 是 C11,这很有趣,因为一些工具集在之前或不支持 C11 之前支持它们。 :P
  • @Swift-FridayPie:错字;诚实吗?
【解决方案2】:

在 ISO C 标准和 VS 中 u8string literals 之一,但您可以通过标头访问它们,可能 locale.h 包含在 string 中。有关这些的 MS 文档是 here

不建议使用这么短的 id ,最好通过fixed length types定义类型

【讨论】:

  • 如前所述,我不是决定使用什么 id 的人(遗憾的是),而且我必须使用的编译器(再次遗憾地)不知道固定长度类型。但是因为我不能告诉 VS 忽略字符串文字(如果我错了,请纠正我)我想我必须在提交之前重命名它并重命名它。谢谢你,虽然你举起了魔法帷幔。
  • 你知道为什么这个最小的例子有效吗?
  • 从技术上讲,标准中没有禁止使用 u8 或任何其他有效标识符作为 typedef。 u8 所做的只是指定它后面的字符串文字包含什么 C11 Standard - 6.4.5 String literals 它是一个 "encoding prefix"
  • @EN20 哪个编译器?这些实际上早于 C11 标准,您需要适当的包含。我知道的大多数嵌入式编译器实际上都有这样的。最少的示例工作,因为它包含最少的集合。
  • @DavidC.Rankin 在 C++ 编译器中实现了用户定义的文字,这对于静态代码分析器来说很有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多