Я унаследовал ужасный бит устаревшего кода, который включает около 1000 строк определения класса полезности, которые должны появиться перед «настоящим» кодом в исходном файле. Для того, чтобы избежать столкновений с другими модулями, которые также могли бы связанные унаследованные классы, я поставил служебный класс в безымянное пространство имен:Есть ли только одно неназванное пространство имен для единицы компиляции?
namespace {
class OldUtils {
OldUtils();
int foo();
double bar();
};
OldUtils::OldUtils() {
// hundreds of lines
}
int OldUtils::foo() {
// hundreds more lines
}
...
}
class ActuallyInteresting {
// uses OldUtils
};
Но я предпочел бы иметь ActuallyInteresting
код, который люди будут (на самом деле), заинтересованными в в верхней части файла, например начиная с строки 50, чем справа внизу, например. начиная с строки 1000. Разделение классной утилиты horrid на отдельный блок компиляции не является вариантом, по причинам более высокого уровня я не буду вдаваться!
Так что мне интересно, можно ли положить короткое объявление класса - без определения метода - в неназванное пространство имен в верхней части файла и более длинные определения методов в другом безымянном пространстве имен внизу:
namespace {
class OldUtils {
OldUtils();
int foo();
double bar();
};
}
class ActuallyInteresting {
// uses OldUtils
};
namespace {
OldUtils::OldUtils() {
// hundreds of lines
}
int OldUtils::foo() {
// hundreds more lines
}
...
}
будут ли эти два «отдельные» безымянные пространства имен можно рассматривать как тот же объем в пределах единицы компиляции, или будет генерироваться различные уникальные пространства имен для каждого? Есть ли в стандарте что-нибудь об этом?
Каждый неназванных имен будет уникальным для каждой единицы перевода (так же, как статический в ЕП) –
@ DieterLücking: Если это так, то как же доступ к глобальной переменной в безымянном пространстве имен в другом ЕП? Добавляется ли название другой единицы перевода в текст разрешения области? –