在 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;
.
我正在尝试使用 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;
.