Hacker News new | comments | show | ask | jobs | submit login

Wow, I didn't know this was valid C code, it's pretty convenient.

  school_t uiuc = {
      .school   = "University of Illinois at Urbana-Champaign",
      .location = "Urbana, IL",
      .program  = "BS Computer Science",
      .started  = 1251158400,
      .left     = 1336608000,
      .accomplishments = {
          "Minor in International Studies in Engineering, Japan",
          "Focused on systems software courses",

I highly recommend "21st Century C" (http://shop.oreilly.com/product/0636920025108.do) as a tour of modern C programming, including use of C99 features. It goes over C tooling (profiling, debugging, testing, cross-platform deployment), and explores C99.

There's a newer edition available which has been published recently:


Following your recommendation, to people interested in learning about Modern C++, Stroustrup's Tour of C++ is a recommended read.


These are called desginated initializers, they're part of C99.[0] This is a good read which discusses them and also devles into compound literals.[1]

[0] https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html [1] https://nickdesaulniers.github.io/blog/2013/07/25/designated...

It's a C99 feature (I think?) -- designated literals. They're absolutely wonderful.

Although GP didn't remark on it, TFA uses an other cool feature which is actually C11: anonymous unions. Although not as wonderful as designated literals, they're really quite convenient.

It's supported by GCC as an extension to C90 too.

what does that even mean? Isn't C99 an extension of C90/ANSI? Doesn't GCC support the whole of C99 as an extension to ANSI?

It means that GCC will allow/support this even if you set it to std=c89 or std=c90.

Won't that only be supported in gnu89 or gnu90 mode?

No, it will be supported using -std=c89 or -std=90, unless you also specify -pedantic.

Yes, I realized after posting that -pedantic is required for strict standards compliance.

The GNU modes just enable additional features which conflict with plain C. Any feature which can coexist with plain C will be enabled in the regular C modes too. For example, __typeof__ is enabled everywhere, because the compiler is allowed to do just about anything it wants with a __ prefix, but plain typeof is only enabled in the GNU modes, since it could cause valid C programs using "typeof" for their own purposes to fail to compile.

C99 is not a strict extension, but as stated in its foreword, "this second edition [C99] cancels and replaces the first edition [C90]".

For instance, implicit function declarations are allowed in C90 but not in C99.

I so, so wish C++ would adopt this feature.

Designated initializers are one of a few indispensable features that make "C++ is a better C" a complete non-starter for me.

They're used heavily in Linux device drivers, amongst other things - here's just one example:


i learnt about them from this post and the library it refers to: http://spin.atomicobject.com/2014/10/08/c99-api-designated-i...

good read, both the post and the socket99 code.

My gcc required me to put { } around any fields of unnamed unions.

[gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)]

gcc 4.4 is getting kind of long in the tooth.

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact