gpt4 book ai didi

c++ - Arduino 静态变量声明没有数据类型?

转载 作者:行者123 更新时间:2023-11-30 20:47:59 24 4
gpt4 key购买 nike

我对 Arduino 很陌生,尝试理解以下变量声明:

static btn_state_t nav_btn, joy_btn;

首先,我希望在“static”后面有一个像整数或浮点之类的数据类型。我只找到一个答案,即变量将被分配默认类型?其次,我不理解以下逗号分隔的“名称”或其他变量。在程序中,看起来它们都可以用于“btn_state_t”。

到目前为止我找不到问题的答案...或者也许有人可以给我提示要查找哪些搜索词?

感谢史蒂夫在下面提供了深刻而完整的答案!完全回答了我的问题,他的猜测是正确的......即使经过相当多的搜索,我也没有发现数据类型和“typedef”是正确的代码字。所以为我解决了。

最佳答案

简短回答:btn_state_t 是一种类型,并且您正在声明该类型的两个变量。

<小时/>

更长的答案:

如果你说

int nav_btn, joy_btn;

您将声明两个 int 类型的变量。类型名称为 int,变量名称为 nav_btnjoy_btn

如果你说

static int nav_btn, joy_btn;

你会做同样的事情,但是静态地声明它们。 (这可以有两种不同的含义,具体取决于声明是在函数内部还是外部,但我们现在不必担心这一点。)在此声明中,关键字 static 被称为 存储类别

曾几何时,很多事情都默认为int。因此,你也可以说

static nav_btn, joy_btn;

它有一个存储类static和两个变量名称nav_btnjoy_btn,但没有类型名称。但它最终做了同样的事情,声明了两个 int 类型的静态变量,因为最初在 C 中,缺少的类型名称默认为 int。这种声明方式如今已经过时了。但这就是您找到的另一个答案所讨论的内容。

但是您偶然发现了另一个案例。你有

static btn_state_t nav_btn, joy_btn;

如果btn_state_tnav_btn之间有逗号,这将是三个静态变量的声明,其类型默认为int。但没有逗号,并且 btn_state_t 中有一点线索 _t。原来 btn_state_t 是一个类型的名称。

这是一个 btn_state_t 类型的两个静态变量的声明,名为 nav_btnjoy_btn

但是这个类型名称btn_state_t是什么?显然,您不会在任何 C 类型列表中找到它,以及 intlong intdouble 以及其他类型。答案是它是一个 typedef 的示例。

在特定于项目的头文件或您正在使用的 GUI 或 I/O 库的头文件中的某个位置,可能是这样的行

typedef int btn_state_t;

这一行定义了一个新的类型名称。新类型名称为 btn_state_t,其命名的类型在其他方面与 int 类型相同。现在当你输入

btn_state_t btn;

btn_state_t nav_btn, joy_btn;

就像你说的那样

int btn;
int nav_btn, joy_btn;

换句话说,typedef 有点像#define。说

typedef int btn_state_t;

有点像说

#define btn_state_t int

之后,每次我们写 btn_state_t 时,就好像我们写了 int 一样。 (但在更复杂的情况下,typedef 可以做 #define 不能做的事情,因此它们实际上根本不是相同的机制。)

Typedef 是一种强大的机制,但出现您从未听说过的新类型名称总是有点令人惊讶,因此有一个约定,即在 typedef 中始终使用后缀 _t姓名。此类 typedef 的其他常见示例包括类型名称,例如 size_ttime_t 以及 int32_t

如果您以前从未遇到过 typedef,您可能想知道它们的用途。您可能想知道为什么它们是必要的,因为乍一看,旧的 #define 似乎可以正常工作。您可能想知道这是什么意思,因为您总是可以说

static int nav_btn, joy_btn;

如果btn_state_t背后的“真实”类型实际上是int。但这个答案已经太长了,所以如果您仍然对 typedef 感到好奇,我会鼓励您对其进行网络搜索并阅读相关内容。

关于c++ - Arduino 静态变量声明没有数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51122309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com