Почему я не могу передать typedef или enum в Arduino?

следующий эскиз не удается скомпилировать в среде Arduino.

учитывая, что typedefs можно использовать в программном обеспечении Arduino, is Автоматическое Поколение Прототипа базовый механизм, который вызывает сбой? Если да, то что это и почему 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 ответов


пожалуйста, обратитесь к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++ в том, как он работает/предварительно обрабатывает файлы.


они пытаются создать прототипы для каждой функции, они находят. К сожалению, если вы определяете typedef в файле перед функцией и используете его в определении функции, место, куда они помещают прототип функции, не видит его, и это создает синтаксическую ошибку.

Если вы используете синтаксис "struct *" вместо этих определений функций, вы получаете выгоду от объекта "непрозрачный тип" C, в котором вы можете использовать определение структуры без его объявления заранее. Итак, сборка состоит в том, что ее использовать, но использовать определение struct в любой функции, что использовать typedef в аргументы.

typedef struct mytype_ {
    int f1;
} mytype_t;

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