Chapter 6. Extensions to the C Language Family 133The label declaration defines the label name, but does not define the label itself. You must do this inthe usual way, with label:, within the statements of the statement expression.The local label feature is useful for complex macros. If a macro contains nested loops, a goto can beuseful for breaking out of them. However, an ordinary label whose scope is the whole function cannotbe used: if the macro can be expanded several times in one function, the label will be multiply definedin that function. A local label avoids this problem. For example:#define SEARCH(value, array, target) \do { \__label__ found; \typeof (target) _SEARCH_target = (target); \typeof (*(array)) *_SEARCH_array = (array); \int i, j; \int value; \for (i = 0; i max; i++) \for (j = 0; j max; j++) \if (_SEARCH_array[i][j] == _SEARCH_target) \{ (value) = i; goto found; } \(value) = -1; \found:; \} while (0)This could also be written using a statement-expression:#define SEARCH(array, target) \({ \__label__ found; \typeof (target) _SEARCH_target = (target); \typeof (*(array)) *_SEARCH_array = (array); \int i, j; \int value; \for (i = 0; i max; i++) \for (j = 0; j max; j++) \if (_SEARCH_array[i][j] == _SEARCH_target) \{ value = i; goto found; } \value = -1; \found: \value; \})Local label declarations also make the labels they declare visible to nested functions, if there are any.Section 6.4 Nested Functions, for details.6.3. Labels as ValuesYou can get the address of a label defined in the current function (or a containing function) with theunary operator &&. The value has type void *. This value is a constant and can be used wherever aconstant of that type is valid. For example:void *ptr;/* ... */ptr = &&foo;