Local Labels in C
Last Updated :
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 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>
#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' };
IS_STR_EMPTY(string);
strcpy (string, "geeksForgeeks" );
IS_STR_EMPTY(string);
return 0;
}
|
Output:
string is empty
string = geeksForgeeks
Share your thoughts in the comments
Please Login to comment...