Error "Se esperaba una declaración" en C incrustado
arm keil (5)
El preprocesador C es (al menos en la forma en que lo usa) solo una simple búsqueda y reemplazo, por lo que se está ejecutando efectivamente
/* main */
{ FIO2DIR &= ~0X00001000 ; } ();
Esto no tiene ningún sentido. Eliminar los paréntesis en la línea
DIR_IN_Tamper();
Para BUZZER_ON y BUZZER_OFF , también desea eliminar los paréntesis. Si la macro no está encerrada entre llaves, también debe agregar esas, como
if(((IN_Tamper >> 12) & 0x01) == 1) {
BUZZER_ON
} else {
BUZZER_OFF
}
Recibo un error como "esperaba una declaración"
mi código es el siguiente
#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();
Me estoy diciendo un error
Se esperaba una declaración para DIR_IN_Tamper ();
esperaba una declaración para la parte else .....
Las macros en C no son funciones. DIR_IN_Tamper(); debería ser DIR_IN_Tamper; .
Si desea utilizar DIR_IN_Tamper como una función, necesita una macro similar a la función:
#define DIR_IN_Tamper() { FIO2DIR &= ~0X00001000 ; }
Entonces, una mejor manera de hacerlo es:
#define DIR_IN_Tamper() do { FIO2DIR &= ~0X00001000 ; } while(0)
... pero esa es una historia diferente.
DIR_IN_Tamper se define como { FIO2DIR &= ~0X00001000 ; } { FIO2DIR &= ~0X00001000 ; } , por lo tanto, cuando el preprocesador analiza su código, esta línea
DIR_IN_Tamper();
se convierte en
{ FIO2DIR &= ~0X00001000 ; }()
Lo cual es claramente incorrecto. No estoy seguro de qué es exactamente lo que está tratando de lograr, pero eliminar los paréntesis eliminará el error de sintaxis:
DIR_IN_Tamper
Además de eso, sospecho que tienes problemas similares con BUZZER_ON y BUZZER_OFF .
Single-statement, macros con funciones similares
No utilice llaves ( { y } ) al definir macros de declaración única como DIR_IN_Tamper .
Para definir de forma segura una macro de función, simplemente ponga su definición entre paréntesis, como esta:
#define DIR_IN_Tamper() (FIO2DIR &= ~0X00001000)
Entonces, llama a tu macro así:
DIR_IN_Tamper();
Se comportará como una función que cambia el valor de FIO2DIR y luego devuelve el valor cambiado:
/* Your macro rewritten as a function.
The return type should be the type of FIO2DIR */
uint32_t DIR_IN_Tamper()
{
return (FIO2DIR &= ~0X00001000);
}
Multi-statement, macros similares a funciones
Si alguna vez necesita definir una macro multi-instrucción, vea esta otra entrada C de preguntas frecuentes .
Por ejemplo, defina BUZZER_OFF como:
#define BUZZER_OFF() do { DIR_BUZ(); B_BUZ_E(0); } while (0)