每个用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