https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93585
--- Comment #3 from Norman Goldstein <normvcr at telus dot net> --- The 2nd reference https://en.cppreference.com/w/cpp/language/definition differentiates between a bare "extern" statement, and an initializing extern statement. The former is a declaration, but not a definition. So, the ODR is not violated. The linker would only need to verify that the types are the same.