在 Arduino 中使用像 类 这样的结构

Using structs like classes in Arduino

我正在尝试使用 Arduino Structs 作为我正在编写的程序的 类 的近似值。这需要包括自引用函数,鉴于 Arduino 编译器中允许和不允许的内容,这绝对是一场噩梦。

这是我正在尝试做的一小部分:

gun.h


struct Gun {
    int id;
    int damage;
    int (* onFire)(struct * g);
};

gun_def.h


#include "gun.h"

extern Gun gunlist[];
extern Gun mygun;

Gun getGun(int id);

gun_def.cpp


#include "gun.h"
#include "gun_def.h"

int fire1(struct * g){
    return g->damage;
}
int fire2(struct * g){
    return g->id;
}

Gun gun1 = {00, 10, fire1};
Gun gun2 = {01, 20, fire2};
Gun gun3 = {02, 20, fire1};

Gun mygun = gun1;
Gun gunlist[3] = {gun1, gun2, gun3};

Gun getGun(int id){
    return gunlist[id];
}

如您所见,这个想法是在 Gun 结构的每个实例中都有一个函数指针,然后某些外部函数将调用它来执行枪的必要回调。

这个实现有很多问题,我无法使用 typedef、额外的头文件或移动定义来解决 Arduino 编译怪异问题。如果有更简单或更容易的方法来执行此操作,请告诉我。对于我要实现的系统,我需要这种变量回调。

我目前遇到的错误跟踪如下:

In file included from gun_def.cpp:1:
gun.h:5: error: expected identifier before '*' token
In file included from /gun_def.h:1,
                 from gun_def.cpp:2:
gun.h:2: error: redefinition of 'struct Gun'
gun.h:2: error: previous definition of 'struct Gun'
gun_def.cpp:4: error: expected primary-expression before 'struct'
gun_def.cpp:4: error: expected ',' or ';' before '{' token
gun_def.cpp:7: error: expected primary-expression before 'struct'
gun_def.cpp:7: error: expected ',' or ';' before '{' token
gun_def.cpp:11: error: invalid conversion from 'int' to 'int (*)(int*)'
gun_def.cpp:12: error: invalid conversion from 'int' to 'int (*)(int*)'
gun_def.cpp:13: error: invalid conversion from 'int' to 'int (*)(int*)'

Can you tell me how the typedef struct Foo {...} Foo; syntax is supposed to read?

长话短说,声明 typedef T Foo;Foo 定义为类型 T 的同义词;您的示例允许将声明写为 e。 g.

Foo foo1;
Foo foo2;

- 如果没有 typedef,名称 Foo 不会表示类型,而只是结构标记,因此需要写成

struct Foo foo1;
struct Foo foo2;

注意:如果您来自 C++,您可能会感到困惑,在 C++ 中可以使用 Foo 作为类型名称而无需完成 typedef struct Foo Foo;.