Por que preferir namespaces anônimos a funções estáticas em C++?
Olá a todos! Sou um desenvolvedor C++ iniciante e, ao estudar o tópico "linkage interno" (internal linkage), me deparei com duas maneiras de tornar funções ou variáveis locais a uma única unidade de tradução (translation unit).
A primeira maneira é usar a palavra-chave `static` para funções e variáveis globais. Por exemplo:
```cpp
// file.cpp
static void helperFunction() {
// ... alguma implementação
}
static int internalCounter = 0;
```
A segunda maneira é colocar tudo em um namespace anônimo (unnamed namespace):
```cpp
// file.cpp
namespace {
void helperFunction() {
// ... alguma implementação
}
int internalCounter = 0;
}
```
Eu entendo que ambas as abordagens tornam os símbolos visíveis apenas dentro deste arquivo. Mas ouço frequentemente de colegas experientes que usar `static` para funções é uma "prática obsoleta" do C, e que no C++ moderno deve-se usar namespaces anônimos.
Vocês podem explicar por que isso é assim?