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 >                                    \
                                                        \
        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

This article is contributed by Kashish Bhatia. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above

GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.

Recommended Posts:



0 Average Difficulty : 0/5.0
No votes yet.










Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.