Open In App

Local Labels in C

Improve
Improve
Like Article
Like
Save
Share
Report

Everybody who has programmed in C programming language must be aware about “goto” and “labels” used in C to jump within a C function. GCC provides an extension to C called “local labels”.

Conventional Labels vs Local Labels
Conventional labels in C have function scope. Where as local label can be scoped to a inner nested block. Therefore, conventional Labels cannot be declared more than once in a function and that is where local labels are used.

A label can appear more than once in function when the label is inside a macro and macro is expanded multiple times in a function. For example if a macro funcMacro() has definition which involves jump instructions (goto statement) within the block and funcMacro is used by a function foo() several times.




#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…);
}


In such a function foo() , the function macro will be expanded two times.
This will result in having more than one definition of label ‘x’ in a function, which leads to confusion to the compiler and results in compilation error. In such cases local labels are useful.
?
The above problem can be avoided by using local labels. A local label are declared as below:

     __label__ label; 

Local label declarations must come at the beginning of the block, before any ordinary declarations or statements.

Below is C example where a macro IS_STR_EMPTY() is expanded multiple times. Since local labels have block scope and every expansion of macro causes a new do while block, the program compiles and runs fine.




#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;
}                


Output:

string is empty
string  = geeksForgeeks


Last Updated : 08 May, 2017
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads