我试图在Arduino ide中做一个链表.
代码如下:
typedef struct ll{
struct ll * prev;
unsigned int currTime;
unsigned int stopTime;
struct ll * next;
} TIMING;
TIMING * head;
TIMING * current;
void setup();
void add_new_first(int stopTimer, TIMING * head);
void main() {
init();
setup();
// Code that uses the def
head->prev = NULL;
head->next = NULL;
head->currTime = 0;
head->stopTime = 200;
}
Run Code Online (Sandbox Code Playgroud)
最后还有功能的实际代码.
这个例子给我错误:
service_timer_cpp.cpp:5:34:错误:'TIMING'尚未声明.
当不使用定义的类型作为参数或从函数返回时,它可以正常工作.
这就是我认为它可以在c中完成并且早先为我工作的方式.我不明白为什么它不适用于Arduino环境.
根据我们的Adruino开发人员之一,预处理器的工作方式与常规C的工作方式不同.在编译过程中会有一些代码生成,这在http://arduino.cc/en/Hacking/中有详细解释.BuildProcess:
转换为主草图文件
在将其传递给avr-gcc编译器之前,Arduino环境会对主草图文件(草图中没有扩展的所有选项卡的串联)执行一些转换.首先,#include"Arduino.h",或者对于小于1.0的版本,#include"WProgram.h"将添加到草图的顶部.此头文件(位于/ hardware/cores //中)包含标准Arduino核心所需的所有定义.
接下来,环境在主草图文件中搜索函数定义,并为它们创建声明(原型).它们在任何注释或预处理器语句(#includes或#defines)之后,但在任何其他语句(包括类型声明)之前插入.这意味着如果要将自定义类型用作函数参数,则应在单独的头文件中声明它.此外,这一代并不完美:它不会为具有默认参数值的函数创建原型,也不会在命名空间或类中声明.
最后,当前目标的main.cxx文件的内容将附加到草图的底部.
这就是为什么struct ll作为一种类型工作正常(不需要typedef),但是typedef'ing导致你看不到代码中的编译错误.