【问题标题】:C code with a union member name the same as its type name联合成员名称与其类型名称相同的 C 代码
【发布时间】:2021-02-13 03:50:55
【问题描述】:

我目前正在使用 C 语言编写一些微控制器代码,而我正在使用的第三方库之一有一些按以下方式定义的结构和联合:

typedef struct
{
    ...members of struct...
} somename;

typedef struct
{
    ...members of struct...
} somename2;

typedef union
{
    somename somename;
    somename2 somename2;
} anothername;

代码在 Atmel Studio 7 中编译(不确定它使用的是什么底层编译器),但无法在 Arduino IDE 中编译(我相信它使用的是某些版本的 gcc/g++)。

上面的代码是有效的C吗?或者它是有效的 C++ 吗?或者两者都有效?对我来说很奇怪,这段代码的作者会给这个联合的成员一个 variable nametype name 相同,而 type name 恰好是他们定义的结构就在文件的上方。

无论如何,Arduino 编译器在到达此代码时会抛出错误,所以我试图弄清楚它是否是有效代码以及如何使 Arduino 编译器喜欢它。有什么建议?谢谢!

【问题讨论】:

  • 它到底抛出了哪些错误?
  • 假设语言允许,为什么看起来很奇怪?如果somename 是结构类型的好名称,那么它也是拥有该类型的成员的好名称。
  • OTOH,通常以_t 结尾类型名称。但是,您应该避免在用户定义的类型中这样做,因为它是由 POSIX 保留的。
  • 为什么关闭?这是一个有效的问题,任何特定编译器输出的错误与这是否是有效的 C 代码无关(剧透:它是)。
  • 我同意这个问题不应该被关闭。关闭它的人应该重新打开它。至于错误:基本上和我描述的一样。 Arduino IDE 对我大喊大叫,“somename”符号已经在同一范围内的其他地方定义(确实如此),而 Atmel 使用的任何编译器都没有这样做。我假设 tue Atmel 编译器是 C 编译器,而 Arduino 是 C++ 编译器。请记住:这不是我的代码,而是我试图引入的第 3 方代码。

标签: c arduino atmel atmelstudio


【解决方案1】:

Ir 默认编译为 C++,因此您需要添加 -xc 命令行选项。

据我所知,C++ 不允许类型和对象使用相同的名称。

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多