1

我在 Arduino 中使用自定义枚举类型时遇到了一些问题。

我在其他地方读到,由于 Arduino IDE 预处理,自定义类型声明需要使用头文件。所以,我已经做到了,但我仍然无法使用我的自定义类型。这是我的主要 arduino 文件 (beacon.ino) 中代码的相关部分

#include <beacon.h>

State state;

在 beacon.h 中:

typedef enum {
  menu,
  output_on,
  val_edit
} State;

但是,当我尝试编译时,出现以下错误:

beacon:20: error: 'State' does not name a type

我认为我编写或包含头文件的方式有问题。但是什么?

4

1 回答 1

6

beacon.h 应如下所示:

/* filename: .\Arduino\libraries\beacon\beacon.h */

typedef enum State{  // <-- the use of typedef is optional
  menu,
  output_on,
  val_edit
};

/* filename: .\Arduino\beacon\beacon.ino */
#include <beacon.h>
State state; // <-- the actual instance
void setup()
{
  state = menu; 
}

void loop()
{
  state = val_edit;
}

当您在主 INO 文件中实例化它时,将 typdef 和“状态”的尾随实例关闭,反之亦然。上面的 beacon.h 文件需要在 users 目录 .\Arduino\libraries\beacon\ 目录下,并且需要重新启动 IDE 以缓存其位置。

但是你可以在 INO 中定义它并一次性实例化它

/* filename: .\Arduino\beacon\beacon.ino */

enum State{
  menu,
  output_on,
  val_edit
} state; // <-- the actual instance, so can't be a typedef

void setup()
{
  state = menu;
}

void loop()
{
  state = val_edit;
}

两者都编译得很好。

您还可以使用以下内容:

/* filename: .\Arduino\beacon\beacon2.ino */

typedef enum State{ // <-- the use of typedef is optional.
  menu,
  output_on,
  val_edit
};

State state; // <-- the actual instance

void setup()
{
  state = menu;
}

void loop()
{
  state = val_edit;
}

这里实例与枚举是分开的,允许枚举只是一个 typedef。上面是一个实例而不是 typedef。

于 2013-07-22T20:57:48.123 回答