c – 我需要#undef一个本地的#define吗?有没有像本地定义的东西
发布时间:2020-12-16 03:15:25 所属栏目:百科 来源:网络整理
导读:有时为了使事情更容易编写和阅读,我在函数中编写了一些本地的#define宏(例如,#define O_REAL Ogre :: Real). 我需要#undef本地的#define,以确保它保持在一定的代码块内吗?或者当超出范围时自动#undef?它甚至有一个范围的概念吗? 在这种情况下,我不确定#de
|
有时为了使事情更容易编写和阅读,我在函数中编写了一些本地的#define宏(例如,#define O_REAL Ogre :: Real).
我需要#undef本地的#define,以确保它保持在一定的代码块内吗?或者当超出范围时自动#undef?它甚至有一个范围的概念吗? 在这种情况下,我不确定#define是如何工作的.现在,我当然试验了代码并得出了一些结论,但由于我不确定,我想要一些专家意见/建议. 解决方法
#define不尊重任何C范围.没有像“本地”#define这样的东西.它将生效,直到它是#undef-ed.预处理器的宏观机制就像大多数文本编辑器中的“查找和替换”功能一样.它不尊重文件的内容.
换句话说,如果您希望#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();
}
你也可以使用typedefs: void DoThis()
{
typedef ReallyLongOuterNamespace::ReallyLongInnerNamespace::Foo MyFoo;
MyFoo f;
}
您也可以使用声明: 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,它似乎是一个float或double的typedef.您仍然可以使用命名空间别名,typedef和使用带有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;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
