Question

I could not find an answer to this on the Internet, so here is my question: Can I define a struct instance without assigning it to a local or global variable in C? E.g.:

struct A {
  int b;
}

struct A foo() {
  return struct A { .b = 42 };
}

If this is not possible: why?

Was it helpful?

Solution

Yes C99 provides compound literals for this (see it live):

return (struct A) {  42 } ;

which is covered in the draft C99 standard section 6.5.2.5 Compound literals and says:

A postfix expression that consists of a parenthesized type name followed by a brace enclosed list of initializers is a compound literal. It provides an unnamed object whose value is given by the initializer list.84)

and:

The value of the compound literal is that of an unnamed object initialized by the initializer list. If the compound literal occurs outside the body of a function, the object has static storage duration; otherwise, it has automatic storage duration associated with the enclosing block.

and provides several examples including:

EXAMPLE 3 Initializers with designations can be combined with compound literals. Structure objects created using compound literals can be passed to functions without depending on member order:

drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4});

gcc also has a nice document on this in it's extension section since it supports this feature outside of C99 as well as clang.

OTHER TIPS

Yes, you can use compound literals in C99 and later.

return (struct A) { .b = 42 };

You can even point to them:

struct A *a = &(struct A) { .b = 42 };
a->b = 43;

These literals are "better" than string literals in that they are writable. The compiler may pool them if and only if you include const in the literal's type .

Yes, it is possible since C99. That is a compound literal.

Still, yours has the wrong syntax. Use:

(struct A){.b=42}

or

(struct A){42}

Though, go for constant literals if it does not matter:

(const struct A){.b=42}

All constant literals are subject to constant pooling (including string literals which have type char[] for historical reasons).
Constant compound literals and compound literals outside any function have static storage duration,
the rest have automatic storage duration (beware returning a pointer, also they must be initialised each time).

In summary, prefer constant literals where possible.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top