使用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基础课程》。