#define
не соответствует ни одной области видимости C ++. Нет такой вещи как "местный" #define
. Это будет действовать до тех пор, пока оно не будет #undef
-ед. Механизм макросов препроцессора аналогичен функциональности «найти и заменить», присутствующей в большинстве текстовых редакторов; он не уважает содержимое файла.
Другими словами, если вы хотите, чтобы ваш #define
был локальным в пределах определенного блока кода, вы должны #undef
указать его в конце этого блока из-за того, что макросы не «понимают» область действия.
Фактически, это одна из главных причин, по которой макросы не рекомендуется использовать, если они не являются абсолютно необходимыми в C ++. Именно поэтому имена макросов обычно вводятся в 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
для float
или double
. Вы по-прежнему можете использовать псевдонимы пространства имен, объявления typedef
s и using
с typedef
s:
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;
}