ожидается а) в IAR IDE

Я получил ошибку Error[Pe018]: expected a ")" в CPU_state == cpuStateOff.
Когда я меняю cpuStateOff на 0, все в порядке. Я не знаю почему.

In my PERIPHERAL_APP.h:

#ifndef __PERIPHERAL_APP_H
#define __PERIPHERAL_APP_H
// CPU state
#define CPU_STATE_OFF     0;
#define CPU_STATE_ON      1;
#endif

In my main.c:

#include "PERIPHERAL_APP.h"
void main( void )
{
    initMSP430();  
    _EINT();                              
    for (;;)
    {
        if (cpuState == CPU_STATE_OFF ) // The error is hear 
        {
            __bis_SR_register(LPM3_bits);
        }
        else
        {
            __bis_SR_register(LPM0_bits); 
        } 
    } 
}

person user3778432    schedule 24.05.2016    source источник
comment
#define cpuStateOff 0; уберите точку с запятой   -  person Biruk Abebe    schedule 24.05.2016
comment
Не имеет отношения к вашей проблеме, но, пожалуйста, научитесь делать отступы в своем коде. Для компилятора это не имеет значения, но для людей очень важна удобочитаемость, и по крайней мере некоторые отступы в коде делают его намного более легким для чтения (и, следовательно, более легким для обслуживания).   -  person Some programmer dude    schedule 24.05.2016
comment
Также не имеет отношения к вашей проблеме, но имена символов, даже имена препроцессоров, начинающиеся с двойного подчеркивания или начинающиеся с одного подчеркивания, за которым следует заглавная буква, зарезервированы для реализации (компилятор и стандартная библиотека ) во всех сферах. Вы не должны использовать такие имена для своих имен.   -  person Some programmer dude    schedule 24.05.2016
comment
Пожалуйста, отредактируйте свой вопрос и сделайте отступ в коде.   -  person Lundin    schedule 24.05.2016
comment
@JoachimPileborg Спасибо за ваши предложения! Я починю это!   -  person user3778432    schedule 24.05.2016


Ответы (1)


Макросы препроцессора не являются операторами C, и поэтому им не нужен терминатор оператора, такой как ;.

Происходит следующее: когда препроцессор заменяет макрос cpuStateOff, он использует все тело макроса, то есть 0;, что приводит к коду вида

if (CPU_state == 0; ) // Code after macro replacement

У большинства компиляторов и сред есть опции для остановки после предварительной обработки, если вы ее используете, вы можете точно увидеть, какой код увидит «правильный» компилятор.

person Some programmer dude    schedule 24.05.2016
comment
я не знал, что IDE предоставляют способ увидеть предварительно обработанный источник. Хорошо знать! - person Biruk Abebe; 24.05.2016