为什么我无法在Arduino中传递typedef或枚举?

8
以下草图无法在Arduino环境中编译。
鉴于 typedefs可在Arduino软件中使用, 是否自动原型生成是导致失败的基本机制?如果是这样,为什么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

问题的总结很好。我也遇到了同样的问题。当我在库示例的上下文中运行一个草图时,一切都正常。但是当我创建一个新的草图,复制示例草图并添加库时,我遇到了OP所描述的错误。将函数声明放在文件顶部或单独的.h文件中解决了这个问题。 - djm
2个回答

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++在文件处理方面的不同之处。

0
他们正在尝试为每个找到的函数创建原型。不幸的是,如果在函数之前在文件中定义了一个typedef,并在函数定义中使用它,放置函数原型的地方将无法看到它,这将生成语法错误。
如果你在那些函数定义中使用'struct *'语法,你就能够享受到C语言的“不透明类型”功能,即你可以在没有事先声明的情况下使用struct定义。所以,先建立typedef,然后使用它,在使用typedef作为参数的函数中使用struct定义。
typedef struct mytype_ {
    int f1;
} mytype_t;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接