以下草图无法在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
答案 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;
}