Etiquetas locales en C

Todos los que han programado en el lenguaje de programación C deben conocer los «goto» y las «etiquetas» que se usan en C para saltar dentro de una función de C. GCC proporciona una extensión a C llamada «etiquetas locales».

Etiquetas convencionales frente a etiquetas locales Las etiquetas
convencionales en C tienen un alcance de función. Donde, como etiqueta local, se puede limitar a un bloque anidado interno. Por lo tanto, las etiquetas convencionales no se pueden declarar más de una vez en una función y ahí es donde se usan las etiquetas locales.

Una etiqueta puede aparecer más de una vez en una función cuando la etiqueta está dentro de una macro y la macro se expande varias veces en una función. Por ejemplo, si una macro funcMacro() tiene una definición que involucra instrucciones de salto (sentencia goto) dentro del bloque y funcMacro es utilizada por una función foo() varias veces.

#define funcMacro(params …)
do {                                                    \
        if (cond == true)                               \
                goto x;                                 \
        <some code >                                    \
                                                        \
        x:                                              \
                <some code>                             \
} while(0);                                             \
  
Void foo()
{
    <some code>
    funcMacro(params …);
    <some code >
    funcMacro(params…);
}

En tal función foo() , la función macro se expandirá dos veces.
Esto dará como resultado tener más de una definición de la etiqueta ‘x’ en una función, lo que genera confusión en el compilador y genera un error de compilación. En tales casos, las etiquetas locales son útiles.

El problema anterior se puede evitar mediante el uso de etiquetas locales. Una etiqueta local se declara de la siguiente manera:

     __label__ label; 

Las declaraciones de etiquetas locales deben ir al comienzo del bloque, antes de cualquier declaración o declaración ordinaria.

A continuación se muestra un ejemplo de C en el que una macro IS_STR_EMPTY() se expande varias veces. Dado que las etiquetas locales tienen alcance de bloque y cada expansión de macro provoca un nuevo bloque do while, el programa se compila y funciona correctamente.

#include <stdio.h>
#include <string.h>
  
//Function macro using local labels
#define IS_STR_EMPTY(str)                                       \
do {                                                            \
        __label__  empty, not_empty, exit;                      \
        if (strlen(str))                                        \
                goto not_empty;                                 \
        else                                                    \
                goto empty;                                     \
                                                                \
        not_empty:                                              \
                printf("string  = %s\n", str);                  \
                goto exit;                                      \
        empty:                                                  \
                printf("string is empty\n");                    \
        exit: ;                                                 \
} while(0);                                                     \
  
int main()
{
        char string[20] = {'\0'};
  
        //Pass empty string to Macro function
        IS_STR_EMPTY(string);
  
  
        //Pass non-empty string to Macro function
        strcpy(string, "geeksForgeeks");
        IS_STR_EMPTY(string);
  
        return 0;
}                

Producción:

string is empty
string  = geeksForgeeks

Este artículo es una contribución de Kashish Bhatia . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *