Chapter 6. Extensions to the C Language Family 2056.40. Incomplete enumTypesYou can define an enum tag without specifying its possible values. This results in an incomplete type,much like what you get if you write struct foo without describing the elements. A later declarationwhich does specify the possible values completes the type.You can’t allocate variables or storage using the type while it is incomplete. However, you can workwith pointers to that type.This extension may not be very useful, but it makes the handling of enum more consistent with theway struct and union are handled.This extension is not supported by GNU C++.6.41. Function Names as StringsGCC provides three magic variables which hold the name of the current function, as a string. The firstof these is __func__, which is part of the C99 standard:The identifier __func__ is implicitly declared by the translator as if, immediately following theopening brace of each function definition, the declarationstatic const char __func__[] = "function-name";appeared, where function-name is the name of the lexically-enclosing function. This name is theunadorned name of the function.__FUNCTION__ is another name for __func__. Older versions of GCC recognize only this name.However, it is not standardized. For maximum portability, we recommend you use __func__, butprovide a fallback definition with the preprocessor:#if __STDC_VERSION__ . 199901L# if __GNUC__ / = 2# define __func__ __FUNCTION__# else# define __func__ ". unknown / "# endif#endifIn C, __PRETTY_FUNCTION__ is yet another name for __func__. However, in C++,__PRETTY_FUNCTION__ contains the type signature of the function as well as its bare name. Forexample, this program:extern "C" {extern int printf (char *, ...);}class a {public:void sub (int i){printf ("__FUNCTION__ = %s\n", __FUNCTION__);printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__);}};intmain (void)