Local Labels in C

08 May, 2017
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 LabelsConventional 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
C Language
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Substring in C++
Multidimensional Arrays in C / C++
Left Shift and Right Shift Operators in C/C++
Different Methods to Reverse a String in C++
std::string class in C++
Unordered Sets in C++ Standard Template Library
rand() and srand() in C/C++
Enumeration (or enum) in C
Memory Layout of C Programs
C Language Introduction