2

コンパイル時に Arduino プリプロセッサに Halt/Abort を通知する方法はありますか?

一般に、高度なプリプロセッサ ディレクティブについてはあまり詳しくありませんが、一部のコンパイラにはコンパイル時のアサーション用の「ライブラリ」があることがわかりました。

バックグラウンド:

コード内でピンが重複して割り当てられないようにするために、各ピンを識別する列挙型を作成しました

enum DataPins
{
    /* 00 */ UNUSED_00,
    /* 01 */ UNUSED_01,
    /* 02 */ PIN_IN_SNR0_ECHO,
    /* 03 */ PIN_IN_SNR1_ECHO,
...
    /* 53 */ UNUSED_53,
    /* check */ z_DONOTUSE54
};

そして、最終的な名前をチェックして、コンパイル時に正しい値であることを確認したいと思います:

#define PinsOK  z_DONOTUSE54==54

コンパイル時にこれを評価する方法はありますか? もしそうなら、その結果に基づいて、Arduinoでコンパイル時のエラーを通知できますか?

4

2 に答える 2

1

プリプロセッサはエラーを生成する可能性がありますが、コンパイル時より前に実行されることを忘れないでください。プリプロセッサディレクティブで示されるように、ソースファイルを処理して置換と変換を行うだけです。厳密に言えば、ファイルがC++ソースコードであるかどうかは関係ありません。

したがって、前処理では、列挙型{}が何を定義するかを知ることはできません。

しかし、それでも質問のエラーの側面が必要な場合:

#define X

#ifdef X
#error ERROR my message
#endif

タイピングを節約し、一貫して列挙型名を作成するための代替手段を探している場合は、プリプロセッサを使用して列挙型行を作成できます。値を明示的に割り当てると、ピンのギャップを気にしない場合があります。

#define P(no_,name_) Pin##name_ = no_
#define U(no_) PinUnused##no_ = no_

enum {
    P(0,Abc),
    U(1),
    P(2,Something),
    P(15,OutWhatever)
};


int p;
p = PinAbc;
p = PinUnused1;
p = PinSomething;
于 2013-02-15T06:55:22.187 に答える
1

http://code.google.com/p/sdfatlib/downloads/listにある ..\SdFat\utility\DigitalPin.h を見ることをお勧めします。これは、ピン チェックとプリコンパイルのアサートの両方を示しています。これは digitalWriteFast.h に似ていますが、もう少し進んでいます。これらの 2 つの例では、ピンが静的か可変かをテストしています。あなたの目標とは少し異なります。

于 2013-02-18T14:55:58.903 に答える