Esp8266 código de archivo de cabecera interpreat

0

Actualmente estoy trabajando en un proyecto en esp8266 y antes de entrar en el proyecto comencé a leer la biblioteca y en una sección encontré algo que no tiene ningún significado para mí. Necesito ayuda en eso

#ifdef NDEBUG
#define ESP_ERROR_CHECK(x) do {                                         \
    esp_err_t rc = (x);                                             \
    (void) sizeof(rc);   //why there is void return                                           \
} while(0);// why do-while loop with 0 as parameter 
#else
#define ESP_ERROR_CHECK(x) do {                                         \
    esp_err_t rc = (x);                                             \
    if (rc != ESP_OK) {                                             \
        _esp_error_check_failed(rc, __FILE__, __LINE__,             \
                                __ASSERT_FUNC, #x);                 \
     }                                                               \
 } while(0);
#endif

Enlace al archivo principal (git hub)

Esperamos saber de ti.

    

1 respuesta

2

Supongo que sus preguntas son las que se agregaron como comentario al código:

El código define dos versiones de una macro. La primera versión se utiliza en el código de lanzamiento. Ejecuta x sin verificar los errores.

La segunda versión se utiliza en las versiones de depuración del código; ejecuta x y verifica el resultado para un estado de error. Si se ha producido un error, imprime un mensaje de error y detiene la ejecución.

El código:

(void) sizeof(rc);

es más probable que se use para evitar una advertencia sobre la variable no utilizada rc . Se requiere (void) para prevenir otra advertencia o error porque sizeof(rc) es una expresión y no una declaración.

El bloque do { ... } while(0); se usa para hacer que la macro se comporte como una sola instrucción. Sin la declaración while , el siguiente bloque no se compilaría:

if (ESP_ERROR_CHECK(esp_wifi_start()))
    abc();
else
    def();

Al menos esa es la intención. Desafortunadamente, no está bien hecho. El punto y coma al final debe eliminarse.

    
respondido por el Codo

Lea otras preguntas en las etiquetas