http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54060
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-07-31 20:41:51 UTC --- Every file that includes the code gets a different type, so S (in comment 0) and B (in comment 1) violate the ODR if defined in more than one translation unit. That's why the warning is given when the code occurs in a header.