我对Arduino很陌生,请尝试了解以下变量声明:
static btn_state_t nav_btn, joy_btn;
首先,我希望在“静态”之后有一个整数或浮点数之类的数据类型。 我只找到一个答案,然后将变量分配给默认类型? 其次,我不理解以下逗号分隔的“名称”或其他变量。 在程序中,看起来它们都可以用于“ btn_state_t”。
到目前为止,我找不到我的问题的答案...或者也许有人可以给我提示要查找哪些搜索词?
感谢史蒂夫在下面提供了深刻而完整的答案!完全回答了我的问题,他的猜测是正确的……即使进行了一些搜索,我仍然没有发现数据类型和“ typedef”是正确的代码字。 为我解决了。
答案 0 :(得分:4)
简短的回答:btn_state_t
是一种类型,您要声明此类型的两个变量。
更长的答案:
如果你说
int nav_btn, joy_btn;
您将声明两个int
类型的变量。类型名称为int
,变量名称为nav_btn
和joy_btn
。
如果你说
static int nav_btn, joy_btn;
您将做同样的事情,但是要静态声明它们。 (根据声明是在函数内部还是外部,这可能有两种不同的含义,但是我们暂时不必担心。)在此声明中,关键字static
被称为 storage类。
从前,很多事情默认为int
。因此,您也可以说
static nav_btn, joy_btn;
它具有一个存储类static
和两个变量名nav_btn
和joy_btn
,但没有类型名。但是最终还是做同样的事情,声明了两个int
类型的静态变量,因为最初在C语言中,缺少的类型名称默认为int
。这种声明风格在今天已经过时了。但这就是您发现的其他答案。
但是您偶然发现了另一个案例。你有
static btn_state_t nav_btn, joy_btn;
如果btn_state_t
和nav_btn
之间有逗号,则将声明三个静态变量,其类型默认为int
。但是没有逗号,_t
中的线索很少btn_state_t
。事实证明,btn_state_t
是类型的名称。
这是两个btn_state_t
类型的静态变量的声明,分别名为nav_btn
和joy_btn
。
但是此类型名称btn_state_t
是什么?显然,在int
和long int
和double
以及其余的所有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_t
,time_t
和int32_t
。
如果您以前从未遇到过typedef,那么您可能想知道它们有什么用。您可能想知道为什么需要它们,因为起初看起来不错的旧#define
可以正常工作。您可能会想知道重点是什么,因为您总是可以说
static int nav_btn, joy_btn;
如果btn_state_t
后面的“实数”类型实际上是int
。但是这个答案已经太久了,因此,如果您仍然对typedef
感到好奇,我会鼓励您对其进行网络搜索并阅读它。