https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80785
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Daniel Gutson from comment #0) > I don't see why one would want to do this. You might have a header that encloses the entire contents in an extern "C" language linkage block, and it might contain static variables. Variables with internal linkage don't have language linkage, so the extern "C" doesn't do anything, but isn't necessarily a mistake. For function definitions it's not contradictory, and not redundant: extern "C" static void f() { } static void g() { } f() and g() both have internal linkage, but have different types. This matters if you want to pass &f to a function that takes a pointer to a function with "C" language linkage (N.B. GCC and many other compilers don't implement this correctly, see PR 2316).