Chapter 6.Extensions to the C Language FamilyGNU C provides several language features not found in ISO standard C. (The -pedantic optiondirects GCC to print a warning message if any of these features is used.) To test for the availability ofthese features in conditional compilation, check for a predefined macro __GNUC__, which is alwaysdefined under GCC.These extensions are available in C and Objective-C. Most of them are also available in C++. Chapter7 Extensions to the C++ Language, for extensions that apply only to C++.Some features that are in ISO C99 but not C89 or C++ are also, as extensions, accepted by GCC inC89 mode and in C++.6.1. Statements and Declarations in ExpressionsA compound statement enclosed in parentheses may appear as an expression in GNU C. This allowsyou to use loops, switches, and local variables within an expression.Recall that a compound statement is a sequence of statements surrounded by braces; in this construct,parentheses go around the braces. For example:({ int y = foo (); int z;if (y 0) z = y;else z = - y;z; })is a valid (though slightly more complex than necessary) expression for the absolute value of foo ().The last thing in the compound statement should be an expression followed by a semicolon; thevalue of this subexpression serves as the value of the entire construct. (If you use some other kind ofstatement last within the braces, the construct has type void, and thus effectively no value.)This feature is especially useful in making macro definitions "safe" (so that they evaluate each operandexactly once). For example, the "maximum" function is commonly defined as a macro in standard Cas follows:#define max(a,b) ((a) (b) ? (a) : (b))But this definition computes either a or b twice, with bad results if the operand has side effects. InGNU C, if you know the type of the operands (here taken as int), you can define the macro safely asfollows:#define maxint(a,b) \({int _a = (a), _b = (b); _a _b ? _a : _b; })Embedded statements are not allowed in constant expressions, such as the value of an enumerationconstant, the width of a bit-field, or the initial value of a static variable.If you don’t know the type of the operand, you can still do this, but you must use typeof (Section6.6 Referring to a Type with typeof).