在我的程序中,有许多类似函数的宏,其中一些具有相同的名称和参数。我想用一些规则来区分它们,有点像命名空间,但我知道我们不能用命名空间组合宏。
还有其他办法吗?
注意:宏不仅仅是简单的赋值,因此很多都不能用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::A
和Divide::A
。
答案 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中它可能会。