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)