2013-02-24 5 views
0

довольно простая проблема у меня есть.C-Macro in if-Condition

У меня есть небольшой макрос для глобальной переменной, которая определена в моем заголовке, как это:

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?

+3

Что вы имеете в виду под «ли работать»? И почему вы используете макросы вместо функций? –

ответ

4
#define get_uart_message_rec() uart_message_received 
               //^no semicolon 

Macro замена будет заменить текст как есть, в том числе ; в вашем случае. Это приведет к синтаксическим ошибкам в случае if.

+0

Хорошо, я мог бы подумать об этом - спасибо. - Это означает, что в моем случае, когда я пишу 'test = get_uart_message_rec();' его практически 'test = get_uart_message_rec() ;;' с двойной двоеточием (что не имеет значения) ..? – Toby

+1

Точно. В C допустимы пустые утверждения, поэтому ';;' не является ошибкой. – Mat

4

Удалить двоеточие в конце:

#define get_uart_message_rec() uart_message_received; 

Потому что будет:

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

Когда препроцессор в основном это найти/заменить на код.

3

У вас есть точка с запятой в конце вашего макроса - удалите это, и все будет хорошо. Обратите внимание, что макросы действительно заменить точно так, как написано, так что ваш макрос из:

if(get_uart_message_rec()==0) 

к:

if(uart_message_received; ==0) 

, который должен сделать ошибку компилятора.

[писать слишком медленно!]

3

Это потому, что у вас есть точка с запятой в конце макроса.

Макросы замещаются как, до фактического компилятор видит текст, так что оператор после замены выглядит следующим образом:

if(uart_message_received;==0)