I want to initialize a struct element, split in declaration and initialization. This is what I have:
typedef struct MY_TYPE {
bool flag;
short int value;
double stuff;
} MY_TYPE;
void function(void) {
MY_TYPE a;
...
a = { true, 15, 0.123 }
}
Is this the way to declare and initialize a local variable of MY_TYPE
in accordance with C programming language standards (C89, C90, C99, C11, etc.)? Or is there anything better or at least working?
Update I ended up having a static initialization element where I set every subelement according to my needs.
C programming language standard ISO/IEC 9899:1999 (commonly known as C99) allows one to use a designated initializer to initialize members of a structure or union as follows:
It is defined in
paragraph 7
, section6.7.8 Initialization
of ISO/IEC 9899:1999 standard as:Note that
paragraph 9
of the same section states that:In GNU GCC implementation however omitted members are initialized as zero or zero-like type-appropriate value. As stated in section 6.27 Designated Initializers of GNU GCC documentation:
Microsoft Visual C++ compiler should support designated initializers since version 2013 according to official blog post C++ Conformance Roadmap. Paragraph
Initializing unions and structs
of Initializers article at MSDN Visual Studio documentation suggests that unnamed members initialized to zero-like appropriate values similarly to GNU GCC.New ISO/IEC 9899:2011 standard (commonly known as C11) which had superseded ISO/IEC 9899:1999 retains designated initializers under section
6.7.9 Initialization
. It also retainsparagraph 9
unchanged.I have read the Microsoft Visual Studio 2015 Documentation for Initializing Aggregate Types yet, all forms of initializing with
{...}
are explained there, but the initializing with dot, named ''designator'' isn't mentioned there. It does not work also.The C99 standard chapter 6.7.8 Initialization explains the possibility of designators, but in my mind it is not really clear for complex structs. The C99 standard as pdf .
In my mind, it may be better to
= {0};
-initialization for all static data. It is less effort for the machine code.Use macros for initializing, for example
typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}
The macro can be adapted, its argument list can be independent of changed struct content. It is proper if less elements should be initialized. It is also proper for nested struct. 3. A simple form is: Initialize in a subroutine:
This routine looks like ObjectOriented in C. Use
thiz
, notthis
to compile it with C++ too!a = (MYTYPE){ true, 15, 0.123 };
would do fine in C99
You can do it with a compound literal. According to that page, it works in C99 (which also counts as ANSI C).
The designations in the initializers are optional; you could also write:
Structure in C can be declared and initialized like this: