halte ich Code wie dies überall in meiner Firma zu sehen:Unnötige Verwendung von unbenannte Namensräume C++
namespace {
const MAX_LIMIT = 50;
const std::string TOKEN = "Token";
}
Ich bin verwirrt, wie, warum Sie einen anonymen Namespace müssen hier. Auf der einen Seite möchten Sie eine lokale Übersetzungseinheit für MAX_LIMIT
AND TOKEN
. Aber das ist schon ohne den anonymen Namensraum aufgrund der const
erreicht. static const
und einfach const
erreichen beide lokale Übersetzungseinheit.
Auf der anderen Seite haben Sie keine Namenskonflikte, wenn Sie irgendwo in Ihrer Datei eine Variable mit dem gleichen Namen haben.
int foo()
{
std::string TOKEN = "MyToken"; // Clash! ::TOKEN vs TOKEN can be used.
}
Das würde den anonymen Namespace rechtfertigen. Aber wie oft brauchen Sie einen Variablennamen in Ihrer Funktion, der bereits von einer außerhalb Ihrer Funktion deklarierten const
Variable belegt ist? Meine Antwort ist niemals. In der Praxis wird also der unbenannte Namensraum nicht benötigt. Irgendwelche Hinweise?
Ich würde sagen Konsistenz: diese 'const' Regel gilt nur für ganzzahlige Typen. – Quentin
@Quentin Huh? 'const' im Namespace-Bereich hat eine interne Verknüpfung, sofern nicht 'extern' markiert ist, für alle Typen –
@ M.M My bad! Ich weiß nicht, woher ich das zurückgerufen habe, aber ich war mir auch ziemlich sicher. Zumindest bin ich nicht allein: D – Quentin