Хотя это старый вопрос, мне кажется, что я должен предложить свое решение этой проблеме, особенно потому, что это один из первых результатов, которые появляются в Google для данного предмета и могут помочь другим.
Этот метод определенно не самый безопасный, поскольку он включает в себя использование препроцессорных директив, но мне понравилось использовать #define и #undef для сокращения пространств имен в заголовках.
Вот пример:
#include "header1"
#define shortNS test::test1
namespace test2 {
class Test1 {
void test(shortNS::test &test) {}
void test1(shortNS::test &test) {}
void test2(shortNS::test &test1, shortNS::test &test2) {}
};
}
#undef shortNS
В основном он работает путем создания определяют называемые «shortNS», что препроцессор слепо заменяет «тест :: test1», где когда-либо это происходит после определения. Разумеется, проблема с определением макроса заключается в том, что он не ограничивается областью действия в какой-либо форме или форме, что может нанести ущерб и, как известно, заставляет любого ничего не подозревающего программиста терять рассудок, пытаясь его отладить.
Таким образом, чтобы предотвратить то, как только мы закончим с определением, мы #undef shortNS, чтобы сообщить препроцессору прекратить замену «shortNS» на «test :: test1». Это позволяет в некоторой степени моделировать область. В приведенном выше примере я ограничил shortNS «областью» файла.
Вот краткий список плюсов и минусов от верхней части головы.
Плюсы:
- Позволяет вручную ограничить объем. (Только для половины функции?).
- Прозрачный для всех, включая файл. не
- Нет левой над пространством имен, как с «пространство имен = B :: C»
- нет пространства имен коллизий с «использованием имен»
- не приносит имен в текущее пространство имен (например, «с использованием пространства имен» делает)
Минусы:
- Любые ошибки в определении укороченного пространства имен будет появляться там, где она не используется и не на самом макросе.
- Если вы включите файл в блок #define #undef, то определение будет использоваться во включенном файле, что может привести к непредвиденным результатам и/или головным болям.
- Если вы забудете #undef, он может/будет разрушать хаос, и вы сойдете с ума.
- Это немного неуклюжий.
- Люди, которые поддерживают ваш код, будут вас ненавидеть.
Короткий рассказ, если вам удобны макросы и не против вытаскивать волосы, пытаясь отладить его, когда он пойдет не так, идите вперед. Препроцессор - очень и очень мощная вещь, но это похоже на наклеивание немного C4 на вашу ногу и затирание клавиатуры, чтобы установить таймер - вы не знаете, когда он сдует вашу ногу.
Приложение: поскольку header2 должен быть включен в другие части программы, использование псевдонимов или псевдонимов не может использоваться. – bighil