Wow, a long-held piece of geek trivia is no longer true.
This
Stack Overflow article points out that in a recent draft of the upcoming
C++0x revision to the C++ standard, file-scope
static
declarations are no longer deprecated. For, oh, 20 years, it's been one of those finer language points that you can whip out to show your sophistication and look down on the ignorant. But between the August 2010 draft
(pdf) and the November 2010 draft
(pdf), the section deprecating
static
has been struck!
If you're unfamiliar with the issue, it's that anonymous
namespaces
provide a more general solution to the multiply-defined symbol problem. Instead of:
static int num = 0;
static int read_num() { return num; }
the preferred C++ way to limit visibility of global objects to file scope was:
namespace {
int num = 0;
int read_num() { return num; }
} // anonymous namespace
The rationale is that you can put other symbols you wish to hide -- like class definitions -- in such a
namespace
, but
static
doesn't help you with those. As the most general solution to the problem,
namespace
wins and
static
loses. But I suppose that 20 years of failing to break people of the
static
habit led to a recent change of heart.
Suits me. I had been consistently using anonymous namespaces for quite a while, both to be modern and especially since it does frequently come up that I want a type that is only used in one file. But
static
declarations are better for self-documenting the code, so I am happy to welcome them back.
Only problem is, I need a new piece of C++ trivia to show off with.