是否可以有2个具有相同名称但不同参数的宏?像这样:
#define FI(value) do {l<<value; Doit(l); } while(0)
#define FI(value, level) do {l<<value ; Doit(l,level); } while(0)
答案 0 :(得分:7)
这是不可能的。
无法重新定义符号名称。与函数不同,宏不能重载。可以想象它的逻辑宏用于纯文本替换,那么如何为同一个实体替换两个不同的东西呢?
另一种更好的解决方案:
您可以编写 inline function 来获得相同的结果。它为您提供了类型检查的额外优势,使您免于宏的黑暗副作用。
答案 1 :(得分:3)
实际上这是可能的。但是,它将导致关于重新定义的编译器警告。
有关详细信息,请参阅此处: http://efesx.com/2010/08/31/overloading-macros/
答案 2 :(得分:1)
这样可行。
#define FI(value, ...) FI_(value, ##__VA_ARGS__, 2, 1)
#define FI_(value, level, n, ...) FI##n(value, level)
#define FI1(value, ...) do {l << value; Doit(l);} while (0)
#define FI2(value, level) do {l << value; Doit(l, level);} while (0)
答案 3 :(得分:0)
在这种情况下,您确实应该使用内联函数。对您正在使用的类型一无所知,可能的实现可能如下所示:
template<typename T>
inline void fi(T & l, const T & value) {
l << value;
Doit(l);
}
template<typename T>
inline void fi(T & l, const T & value, const T & level) {
l << value;
Doit(l, level);
}
如果您遇到过必须坚持使用宏的情况,您将不得不解决这个限制,它们不能超载,至少不符合标准。为了“重载”它们,我们只是在宏的名称上写入参数的数量,这是一种常见的方法(实际上,即使是OpenGL库也使用这种方法来“重载”C函数)。
#define FI1(value) do {l<<value; Doit(l); } while(0)
#define FI2(value, level) do {l<<value ; Doit(l,level); } while(0)