If your colleagues are confused, well ...
...then I'd like to know their opinion on _Complex or _Alignas and, god forbid, _Static_assert or _Generic.
C is not evolving blindingly fast (C++, OTOH did make some giant leaps ten years ago and modern C++ is a completely different beast from the one I learned)
All of the above are features that have been there for ten years, compound literals and designated initializers are old enough to drive, drink and vote almost everywhere (not all at the same time, hopefully
).
They make programs more expressive while not betraying the C "philosophy" and being evolutionary rather than revolutionary.
Some, like _Generic, make it possible to express new concepts or old concetps that required non standard constructs.
Others, like _Static_assert, can make your program safer.
Some others, like _Atomic, do both.
Though I'll admit I have some antipathy for VLAs, and never use them - but I mostly program for small MCUs, so I think it's justified.
I won't comment on the IDE. VS Code (rather, the C/C++ extension) has no problems with these constructs, but I remember getting squiggles when it was in its infancy for designated initializers. Visual Studio understands them no problems.
Resorting to a training wheels language instead of honing skills might work, but does not seem a viable long term strategy.
EtA: a little example of what I'm saying. Look at this (heavily abridged*) code from NXP SDK, and the hoops it needs to jump through for not being able to use _ALignas (I think they go for C99 compliance, which is a reasonable goal for a generic SDK):
struct _lpspi_master_edma_handle
{
...
edma_tcd_t lpspiSoftwareTCD[3]; /*!<SoftwareTCD, internal used*/
};
status_t LPSPI_MasterTransferEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, lpspi_transfer_t *transfer)
{
...
edma_tcd_t *softwareTCD_extraBytes = (edma_tcd_t *)((uint32_t)(&handle->lpspiSoftwareTCD[1]) & (~0x1FU));
edma_tcd_t *softwareTCD_pcsContinuous = (edma_tcd_t *)((uint32_t)(&handle->lpspiSoftwareTCD[2]) & (~0x1FU));
...
}
Why this opprobrium?
Because Transfer Control Descriptors for the iMX.RT DMA must be 32 byte aligned.
Slightly memory wasteful, non portable, non standard and UB as a cherry on top.
*ST: "My HAL is bloated"
NXP: "Hold my beer"