7

次のスケッチは、Arduino 環境でのコンパイルに失敗します。

Arduinoソフトウェア内でtypedefを使用できることを考えると、自動プロトタイプ生成は失敗の原因となる根本的なメカニズムですか? もしそうなら、それは何で、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
4

2 に答える 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++ とどのように機能し、ファイルを前処理するかがどのように異なるかを説明しています。

于 2013-08-10T05:52:26.477 に答える
0

彼らは、見つけたすべての機能のプロトタイプを作成しようとしています。残念ながら、ファイル内で関数の前に typedef を定義し、それを関数定義で使用すると、関数プロトタイプを置く場所ではそれが認識されず、構文エラーが発生します。

これらの関数定義で代わりに 'struct * ' 構文を使用すると、事前に宣言しなくても構造体定義を使用できる C の '不透明型' 機能を利用できます。したがって、typedef を作成して使用しますが、引数で typedef を使用する関数では構造体定義を使用してください。

typedef struct mytype_ {
    int f1;
} mytype_t;

void myfunc(struct mytype_ * xxx) {
    xxx->f1 = 1;
}
于 2014-03-05T21:58:27.007 に答える