I noticed a very curious behavior that, if standard, I would be very happy to exploit (what I’d like to do with it is fairly complex to explain and irrelevant to the question).
The behavior is:
static void name();
void name() {
/* This function is now static, even if in the declaration
* there is no static keyword. Tested on GCC and VS. */
}
What’s curious is that the inverse produces a compile time error:
void name();
static void name() {
/* Illegal */
}
So, is this standard and can I expect other compilers to behave the same way? Thanks!
C++ standard:
In your first case,
nameis declared in a namespace scope (specifically, the global namespace). The first declaration therefore alters the linkage of the second declaration.The inverse is banned because:
So, in your second example, the first declaration has external linkage (by 7.1.1/6), and the second has internal linkage (explicitly), and these do not agree.
You also ask about C, and I imagine it’s the same sort of thing. But I have the C++ book right here, whereas you’re as capable of looking in a draft C standard online as I am 😉