C++ 宏的类命名空间功能
在我的程序中,有很多类似于宏的函数,其中一些具有相同的名称和参数。我想用一些规则将它们分开,有点像名称空间,但我知道我们不能用名称空间对宏进行分组 还有别的办法吗 注意:宏不仅仅是简单的赋值,因此许多宏不能用C++ 宏的类命名空间功能,c++,namespaces,macros,c-preprocessor,C++,Namespaces,Macros,C Preprocessor,在我的程序中,有很多类似于宏的函数,其中一些具有相同的名称和参数。我想用一些规则将它们分开,有点像名称空间,但我知道我们不能用名称空间对宏进行分组 还有别的办法吗 注意:宏不仅仅是简单的赋值,因此许多宏不能用const变量替换 例如,如果有两个宏: #define A(B, C, D) \ { \ D = B * C; \ } #define A(B, C, D) \ { \ D = B /
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
。编辑您似乎在询问类似宏的函数
是,C++中有一个东西,很像“像宏一样的函数”,但它服从命名空间。这是一个函数。而不是宏
#define A(B, C, D) \
{ \
D = B * C; \
}
您可以编写一个函数:
int operation(int left, int right)
{
return left * right;
}
如果需要它与int
以外的其他类型一起使用,可以编写函数模板
尽管如此,对于像本例这样简单的事情,最好的选择是简单地按原样编写乘法,而不使用宏或函数
可以将函数划分为不同类的静态成员函数。但我不建议这样做。相反,我建议您放弃不允许在名称空间中定义函数的愚蠢要求。
使用内联函数。至少对于您提供的示例,这是适当的做法 如果知道类型,则不需要模板。但如果您希望它适用于任何类型,您可以:
namespace Multiply {
template<typename BT, typename CT, typename DT>
void A(BT B, CT C, DT & D)
{
D = B * C;
}
}
名称空间乘法{
模板
无效A(BT B、CT C、DT&D)
{
D=B*C;
}
}
由于无论如何都需要模板定义,编译器可能总是内联的
constexpr
如果只打算在编译时执行,则可能会很有用。我认为,在C++11中,它不适用于上述示例。但在C++14中可能会出现这种情况。“我知道我们不能在名称空间中使用define函数”。你是什么意思?我根本不明白你在这里问什么。为什么不在宏名称前面加上“名称空间名称”,比如MULTIPLY\u A
,而不是MULTIPLY::A
?你为什么需要宏?它们不是更快,它们不可维护,它们不能被标记,在调试过程中出现问题,它们没有节省空间。这对你根本没有好处。因此,如果不需要,只需使用C++代码,而不使用任何预处理器垃圾。如果有的话,参数被推到堆栈上,而不是堆上。但最有可能的是,特别是对于您的小示例,它们可以通过寄存器传递。此外,如果您允许编译器进行优化,它将内联函数。