C语言中的本地标签

每个用C编程语言编程的人都必须知道在C函数中使用“goto”和“labels”来跳转。GCC为C提供了一个名为“本地标签”的扩展。

null

传统标签与本地标签 C中的常规标签具有功能范围。其中,as local label的范围可以限定为内部嵌套块。因此,在一个函数中不能多次声明常规标签,而这正是使用本地标签的地方。

当标签位于宏中且宏在函数中展开多次时,标签可以在函数中出现多次。例如,如果宏funcMacro()的定义涉及块内的跳转指令(goto语句),并且函数foo()多次使用funcMacro。

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


在这样的函数foo()中,函数宏将展开两次。 这将导致函数中有多个标签“x”的定义,这将导致编译器混淆,并导致编译错误。在这种情况下,本地标签很有用。 使用本地标签可以避免上述问题。本地标签声明如下:

     __label__ label; 

本地标签声明必须出现在块的开头,在任何普通声明或语句之前。

下面是一个C示例,其中一个宏是_STR_EMPTY(),它被多次展开。由于本地标签具有块作用域,并且宏的每次扩展都会导致新的do while块,因此程序编译和运行良好。

#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" , str);
goto exit ;
empty:
printf ( "string is empty" );
exit : ;
} while (0);
int main()
{
char string[20] = { ' ' };
//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;
}


输出:

string is empty
string  = geeksForgeeks

本文由 卡西什·巴蒂亚 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享