Ответ 1
#define
не относится к области С++. Нет такой вещи, как "локальный" #define
. Он будет действовать до тех пор, пока не будет #undef
-ed. Механизм макросов препроцессора аналогичен функциям "find-and-replace", найденным в большинстве текстовых редакторов; он не имеет никакого отношения к содержимому файла.
Другими словами, если вы хотите, чтобы ваш #define
был локальным в определенном блоке кода, вы должны #undef
его в конце этого блока из-за того, что макросы не "понимают" область.
На самом деле, одна из главных причин, почему макросы обескуражены, если они не являются абсолютно необходимыми в С++. Это почему имена макросов обычно печатаются в UPPER_CASE
, чтобы указать, что это фактически макрос.
На самом деле существует довольно много макро-решений для вашей конкретной ситуации. Рассмотрим следующее:
namespace ReallyLongOuterNamespace
{
namespace ReallyLongInnerNamespace
{
class Foo {};
void Bar() {}
};
}
void DoThis()
{
// Too much typing!
ReallyLongOuterNamespace::ReallyLongInnerNamespace::Foo f;
ReallyLongOuterNamespace::ReallyLongInnerNamespace::Bar();
}
Вы можете использовать псевдонимы пространства имен:
void DoThis()
{
namespace rlin = ReallyLongOuterNamespace::ReallyLongInnerNamespace;
rlin::Foo f;
rlin::Bar();
}
Вы также можете использовать typedef
s:
void DoThis()
{
typedef ReallyLongOuterNamespace::ReallyLongInnerNamespace::Foo MyFoo;
MyFoo f;
}
Вы также можете использовать объявления using
:
void DoThis()
{
using ReallyLongOuterNamespace::ReallyLongInnerNamespace::Foo;
using ReallyLongOuterNamespace::ReallyLongInnerNamespace::Bar;
Foo f;
Bar();
}
Вы даже можете использовать комбинацию из вышеперечисленного!
void DoThis()
{
namespace rlin = ReallyLongOuterNamespace::ReallyLongInnerNamespace;
typedef rlin::Foo MyFoo;
using rlin::Bar;
MyFoo f;
Bar();
}
В отношении Ogre::Real
он представляется как typedef
для a float
или double
. Вы все равно можете использовать псевдонимы пространства имен, объявления typedef
и using
с помощью typedef
:
void UseOgre()
{
typedef Ogre::Real o_Real; // Yes, you can typedef typedefs.
using Ogre::Real;
/* Or, you can use:
namespace o = Ogre;
typedef o::Real o_Real;
using o::Real;
*/
// All equivalent
Ogre::Real r1;
o_Real r2;
Real r3;
o::Real r4;
}