加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读