没有数据类型的Arduino静态变量声明?

时间:2018-07-01 10:04:15

标签: c++ c variables definition

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

static btn_state_t nav_btn, joy_btn;

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

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

感谢史蒂夫在下面提供了深刻而完整的答案!完全回答了我的问题,他的猜测是正确的……即使进行了一些搜索,我仍然没有发现数据类型和“ typedef”是正确的代码字。 为我解决了。

1 个答案:

答案 0 :(得分:4)

简短的回答:btn_state_t是一种类型,您要声明此类型的两个变量。


更长的答案:

如果你说

int nav_btn, joy_btn;

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

如果你说

static int nav_btn, joy_btn;

您将做同样的事情,但是要静态声明它们。 (根据声明是在函数内部还是外部,这可能有两种不同的含义,但是我们暂时不必担心。)在此声明中,关键字static被称为 storage类

从前,很多事情默认为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。但是没有逗号,_t中的线索很少btn_state_t。事实证明,btn_state_t是类型的名称。

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

但是此类型名称btn_state_t是什么?显然,在intlong intdouble以及其余的所有C类型列表中都找不到它。答案是这是 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。这种类型定义的其他常见示例是类型名称,例如size_ttime_tint32_t

如果您以前从未遇到过typedef,那么您可能想知道它们有什么用。您可能想知道为什么需要它们,因为起初看起来不错的旧#define可以正常工作。您可能会想知道重点是什么,因为您总是可以说

static int nav_btn, joy_btn;

如果btn_state_t后面的“实数”类型实际上是int。但是这个答案已经太久了,因此,如果您仍然对typedef感到好奇,我会鼓励您对其进行网络搜索并阅读它。