Typedef不作为参数工作或在Arduino sketch函数中返回

Ein*_*ren 4 c typedef arduino

我试图在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环境.

Pav*_*vel 5

根据我们的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导致你看不到代码中的编译错误.