Local Labels in C

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 >                                   
                <some code>                            
} while(0);                                            
Void foo()
    <some code>
    funcMacro(params …);
    <some code >

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;                                
                goto empty;                                    
                printf("string  = %s ", str);                 
                goto exit;                                     
                printf("string is empty ");                   
        exit: ;                                                
} while(0);                                                    
int main()
        char string[20] = {''};
        //Pass empty string to Macro function
        //Pass non-empty string to Macro function
        strcpy(string, "geeksForgeeks");
        return 0;


string is empty
string  = geeksForgeeks

This article is attributed to GeeksforGeeks.org



leave a comment



load comments

Subscribe to Our Newsletter