📜  C中的本地标签

📅  最后修改于: 2021-05-25 19:38:33             🧑  作者: Mango

使用C编程语言进行编程的每个人都必须了解C中用于跳转到C函数的“ goto”和“ labels”。 GCC提供了对C的扩展,称为“本地标签”。

常规标签vs本地标签
C中的常规标签具有函数范围。其中,as局部标签的作用域可以是内部嵌套块。因此,常规标签不能在一个函数声明一次以上,这就是使用局部标签的地方。

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

#define funcMacro(params …)
do {                                                    \
        if (cond == true)                               \
                goto x;                                 \
                                            \
                                                        \
        x:                                              \
                                             \
} while(0);                                             \
  
Void foo()
{
    
    funcMacro(params …);
    
    funcMacro(params…);
}

在这样的函数foo()中,函数宏将扩展两次。
这将导致在一个函数对标签’x’进行多个定义,从而导致编译器混乱并导致编译错误。在这种情况下,本地标签很有用。通过使用本地标签可以避免上述问题。本地标签声明如下:

__label__ label; 

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

下面是C示例,其中宏IS_STR_EMPTY()被多次扩展。由于局部标签具有块作用域,并且宏的每次扩展都会导致while块发生新的变化,因此程序可以编译并正常运行。

#include 
#include 
  
//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;
}                

输出:

string is empty
string  = geeksForgeeks
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。