c – 我需要#undef一个本地的#define吗?有没有像本地定义的东西?

前端之家收集整理的这篇文章主要介绍了c – 我需要#undef一个本地的#define吗?有没有像本地定义的东西?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有时为了使事情更容易编写和阅读,我在函数中编写了一些本地的#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;
}
原文链接:https://www.f2er.com/c/112053.html

猜你在找的C&C++相关文章