c arm keil arm7

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

  1. Se esperaba una declaración para DIR_IN_Tamper ();

  2. 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)