On Tue, Jul 16, 2019 at 12:01:10PM -0700, Junio C Hamano wrote: > And that "quiet and nice" form is a moral equivalent of > > struct foo foo = { 0 }; > > that has been discussed in this thread. I'd rather not to see it > turned into distinct FOO_INIT, BAR_INIT, etc. to force the reader to > think these structures all need their specific initialization and > wonder what's the reason for each of them. I'm on the fence for that style myself. But we've definitely been trending in that direction. Look at `git grep _INIT *.h`, many of which are clearly zero-initializers. I do think it's nice to be able to modify the initializers later and feel confident that you're catching all of the users. But even then: - it's not like we get any kind of static warning for a zero-initialized variant (be it static or with a manual {0} initializer) - I know I've run into problems where code assumed memset() worked, but it didn't (I think diff_options was one such case). So at best it's "feel more confident", not "feel confident". :) > One universal "struct foo foo = STRUCT_ZERO_INIT;" that is applied > to all kinds of structure I could live with (but only if we have a > good way to squelch sparse from bitching about it). Perhaps we > could define it as "{}" for GCC, while keeping it "{ 0 }" for > others. As I said, { 0 } is undefensible if we insist that a null > pointer must be spelled NULL and not 0 (as CodingGuidelines says), > but as long as we declare that we take "{ 0 }" as a mere convention > (like we used to use the "int foo = foo;" convention to squelch > "uninitialized but used" warnings) that is outside the purview of > language-lawyers, I am perfectly fine with it, and if it is hidden > behind a macro, that would be even better ;-) Yeah, I am OK with that. My big question is if we use "{}" for gcc (and compatible friends), does that squelch all of the complaints from other compilers and tools that might see the "{0}" version? In particular, does it work for sparse? -Peff