类似于命名空间的宏功能

时间:2016-05-23 11:26:59

标签: c++ namespaces macros c-preprocessor

在我的程序中,有许多类似函数的宏,其中一些具有相同的名称和参数。我想用一些规则来区分它们,有点像命名空间,但我知道我们不能用命名空间组合宏。

还有其他办法吗?

注意:宏不仅仅是简单的赋值,因此很多都不能用const变量替换。

例如,如果有两个宏:

#define A(B, C, D)  \
{                   \
    D = B * C;      \
}

#define A(B, C, D)  \
{                   \
    D = B / C;      \
}

我想用一些名称空间拆分它们:

/* Pseudocode */
namespace Multiply {
    #define A(B, C, D)  \
    {                   \
        D = B * C;      \
    }
}

namespace Divide {
    #define A(B, C, D)  \
    {                   \
        D = B / C;      \
    }
}

然后可以在我的程序中调用Multiply::ADivide::A

2 个答案:

答案 0 :(得分:3)

编辑您似乎在询问宏等功能。

嗯,C ++中的一些东西很像这样的函数,但是服从命名空间。这是一个功能。而不是宏

9

你可以写一个函数:

4.05

如果您需要使用#define A(B, C, D) \ { \ D = B * C; \ } 以外的其他类型,您可以编写功能模板。

虽然对于像这个例子这样简单的事情,最好的选择是简单地按原样编写乘法,而不使用宏,也不用函数。

<击> 您可以将函数划分为不同类的静态成员函数。但我不建议这样做。相反,我建议你放弃在命名空间中不允许定义函数的愚蠢要求。

答案 1 :(得分:2)

使用内联函数。至少对于您提供的示例,这是适当的事情。

如果您知道类型,则不需要模板。但如果你想让它适用于任何类型,你可以:

namespace Multiply {
    template<typename BT, typename CT, typename DT>
    void A(BT B, CT C, DT & D)
    {
        D = B * C;
    }
}

由于无论如何都需要模板定义,编译器可能总是内联。

如果您只打算编译时执行,

constexpr可能会有用。在C ++ 11中,我认为它不适用于上面的例子。但在C ++ 14中它可能会。