Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有不同参数的同名宏_C++_Visual C++_Macros - Fatal编程技术网

C++ 具有不同参数的同名宏

C++ 具有不同参数的同名宏,c++,visual-c++,macros,C++,Visual C++,Macros,有可能有两个同名但参数不同的宏吗?大概是这样的: #define FI(value) do {l<<value; Doit(l); } while(0) #define FI(value, level) do {l<<value ; Doit(l,level); } while(0) template<typename T> inline void fi(T & l, const T & value) { l << val

有可能有两个同名但参数不同的宏吗?大概是这样的:

#define FI(value) do {l<<value;  Doit(l); } while(0)
#define FI(value, level) do {l<<value ; Doit(l,level); } while(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);
}
#定义FI(值){l这是不可能的。
不能重新定义符号名。与函数不同,宏不能重载。从逻辑上讲,宏用于纯文本替换,那么如何为同一实体替换两个不同的东西呢

另一种更好的解决方案:

您可以编写一个程序来实现相同的结果。它为您提供了类型检查的额外优势,并使您免于宏的模糊副作用。

实际上这是可能的。但是,它将导致编译器发出有关重新定义的警告

有关更多详细信息,请参见:

在这种情况下,您确实应该使用内联函数。不知道您正在使用的类型,可能的实现可能如下所示:

#define FI(value) do {l<<value;  Doit(l); } while(0)
#define FI(value, level) do {l<<value ; Doit(l,level); } while(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);
}
模板
内联无效fi(T&l、常数T和值){
这会有用的

#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)
#定义FI(值,…)FI################VA(参数)(2,
#定义FI#n(值,级别,n…)FI#n(值,级别)

#定义FI1(值,…)do{l是的,它被称为“内联函数”@DeadMG有些人不喜欢听它,但有些情况下我们需要宏。比如循环的语法糖。请看。当然,你的论点在这里的这个例子中非常好。@leems C++11的基于范围的循环取代了
BOOST\u FOREACH
:)@fredsoverflow我知道。但是(1)仍然有一些情况下自定义循环很好,(2)有些编译器还没有完全支持C++11。我认为有些库我们希望在未来几年内仍然支持较旧的编译器。:)一个定义规则与预处理器宏无关。如果您以前使用过#Undefine,您可以重新定义宏。@TadeuszKopec:您是对的。宏是eval在预处理和编译器中,实现ODR的编译器从未看到任何宏。死链接-这看起来不可能。在Visual Studio中亲自尝试会产生关于重新定义的错误。