> [...] I wonder how we can resolve this case: > extern struct netif_stats le_stats[]; > > static struct netif_dif le_ifs[] = { > /* dif_unit dif_nsel dif_stats dif_private */ > { 0, NLE0CONF, &le_stats[0], le0conf, }, > }; > #define NLE_IFS (sizeof(le_ifs) / sizeof(le_ifs[0])) > > struct netif_stats le_stats[NLE_IFS];
That is not an extern declaration from a conceptual point of view; it's just a forward declaration which happens to be implemented with a (redundant) "extern" keyword. (Even strict def/ref systems must implement the tentative-definition paradigm for multiple declarations within a single translation unit - C99 6.9.2, paragraph 2 in particular.) Still, I think it could be improved. I would say that: - If le_stats is - or might be, eg, depending on #defines - used from another file, the extern declaration should be moved into a .h used by both files. - If not, the extern should be converted to static and the later declaration should have static added to it. (I really wish C had chosen a different keyword for linkage control of file-scope declarations; overloading static for storage duration control at block scope and linkage control at file scope is ugly and confusing.) /~\ The ASCII Mouse \ / Ribbon Campaign X Against HTML mo...@rodents-montreal.org / \ Email! 7D C8 61 52 5D E7 2D 39 4E F1 31 3E E8 B3 27 4B