【发布时间】: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 name 与 type name 相同,而 type name 恰好是他们定义的结构就在文件的上方。
无论如何,Arduino 编译器在到达此代码时会抛出错误,所以我试图弄清楚它是否是有效代码以及如何使 Arduino 编译器喜欢它。有什么建议?谢谢!
【问题讨论】:
-
它到底抛出了哪些错误?
-
假设语言允许,为什么看起来很奇怪?如果
somename是结构类型的好名称,那么它也是拥有该类型的成员的好名称。 -
OTOH,通常以
_t结尾类型名称。但是,您应该避免在用户定义的类型中这样做,因为它是由 POSIX 保留的。 -
为什么关闭?这是一个有效的问题,任何特定编译器输出的错误与这是否是有效的 C 代码无关(剧透:它是)。
-
我同意这个问题不应该被关闭。关闭它的人应该重新打开它。至于错误:基本上和我描述的一样。 Arduino IDE 对我大喊大叫,“somename”符号已经在同一范围内的其他地方定义(确实如此),而 Atmel 使用的任何编译器都没有这样做。我假设 tue Atmel 编译器是 C 编译器,而 Arduino 是 C++ 编译器。请记住:这不是我的代码,而是我试图引入的第 3 方代码。
标签: c arduino atmel atmelstudio