0

ここで私が抱えている非常に単純な問題。

次のようにヘッダーで定義されているグローバル変数用の小さなマクロがあります。

extern bool uart_message_received;
#define get_uart_message_rec() uart_message_received;

私のCファイルでは、次のようにファイルにアクセスしたい:

 bool uart_message_received = 0;
 void foo(void)
 {
       bool test;
       test = get_uart_message_rec();  // Works fine

       if(get_uart_message_rec()==0)    // Doesn't work
       {
          //...
       } 
 }

の状態が機能しない理由が少しわかりifません。私は何か間違ったことをしていますか、それともいくつかの C ディレクティブに違反していますか?

4

4 に答える 4

4

の末尾にあるコロンを削除します。

#define get_uart_message_rec() uart_message_received;

次のようになるためです。

if(**uart_message_received;**==0)    // Doesn't work
{
    //...
} 

プリプロセッサが基本的にコードを検索/置換する場合。

于 2013-02-24T16:46:21.490 に答える
4
#define get_uart_message_rec() uart_message_received
                                                 // ^ no semicolon

マクロ置換は;、あなたのケースを含め、テキストをそのまま置き換えます。この場合、構文エラーが発生しますif

于 2013-02-24T16:46:24.860 に答える
3

マクロの最後にセミコロンがあります - それを削除すれば問題ありません。マクロは記述どおりに置換されるため、マクロは次のように展開されることに注意してください。

if(get_uart_message_rec()==0)

に:

if(uart_message_received; ==0)

これにより、コンパイラエラーが発生するはずです。

【書くのが遅すぎる!】

于 2013-02-24T16:47:01.210 に答える
3

マクロの最後にセミコロンがあるためです。

マクロは、実際のコンパイラがテキストを見る前にそのまま置き換えられるため、置き換え後のステートメントは次のようになります。

if(uart_message_received;==0)
于 2013-02-24T16:47:05.300 に答える