为什么我不能在Arduino中传递typedef或enum?

时间:2013-08-10 02:34:01

标签: c++ arduino typedef

以下草图无法在Arduino环境中编译。

鉴于typedefs can be used within Arduino software,是自动原型生成导致失败的潜在机制?如果是这样,它是什么,为什么Arduino不提供围绕C ++的轻量级包装?

#define PRODUCE_WACKY_COMPILETIME_ERROR
typedef int MyMeaningfulType;

#ifndef PRODUCE_WACKY_COMPILETIME_ERROR
void myFunc(MyMeaningfulType myParam);
#endif

void myFunc(MyMeaningfulType myParam)
{
  myFunc(10);
}

void setup() {}
void loop() {}

为了搜索引擎的利益,报告的错误是:

error: variable or field 'myFunc' declared void
error: 'MyMeaningfulType' was not declared in this scope

2 个答案:

答案 0 :(得分:8)

请参阅http://arduino.cc/en/Hacking/BuildProcess特定报价:

This means that if you want to use a custom type as a function argument, you should declare it within a separate header file.

这个页面很好地解释了Arduino语言与C / C ++的不同之处在于它如何工作/预处理文件。

答案 1 :(得分:0)

他们正在尝试为他们找到的每个功能创建原型。不幸的是,如果你在函数之前在文件中定义了一个typedef,并在函数定义中使用它,那么它们放置函数原型的位置就不会看到它,这会产生语法错误。

如果在这些函数定义中使用'struct *'语法,则可以从C的'opaque type'工具中受益,在该工具中,您可以使用结构定义,而无需事先声明它。因此,构建typedef,使用它,但在任何在参数中使用typedef的函数中使用struct定义。

typedef struct mytype_ {
    int f1;
} mytype_t;

void myfunc(struct mytype_ * xxx) {
    xxx->f1 = 1;
}