5

「expected an statement」のようなエラーが表示されます

私のコードは次のとおりです

#define IN_Tamper    0X00001000     /*P2.12 = EINT2*/
#define DIR_IN_Tamper    { FIO2DIR &= ~0X00001000 ; } 

/* main */
DIR_IN_Tamper(); 
if(((IN_Tamper >> 12) & 0x01) == 1)
            BUZZER_ON();
         else
            BUZZER_OFF();   

というエラーが表示されます

  1. DIR_IN_Tamper(); のステートメントが必要です。

  2. else 部分のステートメントが期待されます.....

4

5 に答える 5

7

C プリプロセッサは (少なくとも使用方法では) 単純な検索と置換にすぎないため、効果的に実行されています。

/* main */
{ FIO2DIR &= ~0X00001000 ; } (); 

これは意味がありません。行の括弧を削除します

DIR_IN_Tamper(); 

BUZZER_ONとについてBUZZER_OFFは、括弧も削除します。マクロが中かっこで囲まれていない場合は、次のように中かっこも追加します。

if(((IN_Tamper >> 12) & 0x01) == 1) {
    BUZZER_ON
} else {
    BUZZER_OFF
}
于 2013-07-12T10:17:41.803 に答える
2

関数のように使いたい場合DIR_IN_Tamperは、関数のようなマクロが必要です。

#define DIR_IN_Tamper()    { FIO2DIR &= ~0X00001000 ; } 

次に、それを行うより良い方法は次のとおりです。

#define DIR_IN_Tamper()    do { FIO2DIR &= ~0X00001000 ; } while(0)

…が、それは別の話です。

于 2013-07-12T10:21:42.283 に答える
2

DIR_IN_Tamperとして定義されている{ FIO2DIR &= ~0X00001000 ; }ため、プリプロセッサがコードを解析すると、この行

DIR_IN_Tamper(); 

に変換されます

{ FIO2DIR &= ~0X00001000 ; }()

これは明らかに正しくありません。何を達成しようとしているのか正確にはわかりませんが、括弧を削除すると構文エラーが解消されます。

DIR_IN_Tamper

BUZZER_ONそれに加えて、 と にも同様の問題があると思われますBUZZER_OFF

于 2013-07-12T10:18:48.757 に答える
1

単一ステートメントの関数のようなマクロ

のような単一ステートメントのマクロを定義するときは、中括弧 ({および) を使用しないでください。}DIR_IN_Tamper

関数のようなマクロを安全に定義するには、次のように定義を括弧で囲みます。

#define DIR_IN_Tamper() (FIO2DIR &= ~0X00001000)

次に、次のようにマクロを呼び出します。

DIR_IN_Tamper();

FIO2DIRの値を変更し、変更された値を返す関数のように動作します。

/* Your macro rewritten as a function.
   The return type should be the type of FIO2DIR */
uint32_t DIR_IN_Tamper()
{
    return (FIO2DIR &= ~0X00001000);
}

複数ステートメント、関数のようなマクロ

複数ステートメントのマクロを定義する必要がある場合は、この他の C FAQ エントリを参照してください。

たとえば、次のように定義BUZZER_OFFします。

#define BUZZER_OFF() do { DIR_BUZ(); B_BUZ_E(0); } while (0)
于 2013-07-12T10:31:48.373 に答える
0

C のマクロは関数ではありません。DIR_IN_Tamper();する必要がありますDIR_IN_Tamper;

于 2013-07-12T10:18:25.523 に答える