Jeff Plaisance Jeff Plaisance - 2 months ago 7
C Question

In what versions of C is a block inside parenthesis used to return a value valid?

If I do:

int j = ({int x = 7; x+3;});


In i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646) gcc it compiles just fine. The block in question
({int x = 7; x+3;})
returns the value of the last statement as the value of the block. If you remove the parenthesis it doesn't compile. Can I expect this to work in most C compilers?

Additionally, what is the name for this construct? I have had a lot of trouble searching for it because search engines don't index
()
or
{}
and C is a terrible search term. I also haven't been able to find anything about it in any of my books, probably because I don't know what to look for.

Answer

If you remove the parenthesis it doesn't compile.

Without the parentheses, the compiler will treat this as an aggregate initialization block and will fail when it sees the int keyword. You cannot have keywords in initializer blocks.

6.7.8 Initialization

11 The initializer for a scalar shall be a single expression, optionally enclosed in braces. The initial value of the object is that of the expression (after conversion); the same type constraints and conversions as for simple assignment apply, taking the type of the scalar to be the unqualified version of its declared type.

6.2.5 Types

21 Arithmetic types and pointer types are collectively called scalar types. Array and structure types are collectively called aggregate types.


Can I expect this to work in most c compilers?

No. Looks like a non-standard GNU extension.

Additionally, what is the name for this construct?

I wonder if there is any. Actually, this is similar to what macros typically do.