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++代码,而不使用任何预处理器垃圾。如果有的话,参数被推到堆栈上,而不是堆上。但最有可能的是,特别是对于您的小示例,它们可以通过寄存器传递。此外,如果您允许编译器进行优化,它将内联函数。