C++ 警告:逗号的左/右操作数无效

C++ 警告:逗号的左/右操作数无效,c++,g++,C++,G++,我有这些警告,我不知道如何解决它们 warning: left-hand operand of comma has no effect warning: right-hand operand of comma has no effect 代码: size_t cCsvAlias::operator [] (const char* name) const { NAME2INDEX_MAP::const_iterator itr(m_Name2Index.find(Lower(name))

我有这些警告,我不知道如何解决它们

warning: left-hand operand of comma has no effect
warning: right-hand operand of comma has no effect
代码:

size_t cCsvAlias::operator [] (const char* name) const
{
    NAME2INDEX_MAP::const_iterator itr(m_Name2Index.find(Lower(name)));
    if (itr == m_Name2Index.end())
    {
        LogToFile(NULL, "cannot find suitable conversion for %s", name);
        Assert(false && "cannot find suitable conversion");
        return 0;
    }

    return itr->second;
}
警告来自:

LogToFile(NULL, "cannot find suitable conversion for %s", name);
提前谢谢

编辑:


手动展开宏,就像预处理器为您所做的那样,您会得到:

(void) (0);(NULL, "cannot find suitable conversion for %s", name);
右括号中的表达式由逗号运算符分隔的三条语句组成。编译器警告您,前两个无效


逗号运算符将多个表达式缝合在一起,并按顺序计算它们。右括号中以逗号分隔的表达式计算为逗号链中最后一个表达式的值(
name
)。但是,前两个表达式(
NULL
“找不到“%s”
)的合适转换,实际上什么都不做;这就是编译器警告您的内容。

您可以通过将宏替换为以下内容来解决警告:

inline void __throw_to_dev_null(const void*, const char*, ... ) {}
#define LogToFile __throw_to_dev_null

LogToFile
的定义是什么?
LogToFile
可能不需要3个参数。显示它的签名是一个宏
LogToFile
一个宏?按照惯例,你应该让宏都是大写字母,并使用下划线来避免这种混淆。@sp2danny它可能是一个宏。如果它是一个函数,编译器会编译它如果参数的数目不对,则无法将其转换为逗号运算符。@Barmar您是在问这个问题:#define LogToFile(void)(0)?准确地说,
0
在宏定义中被括起来,因此在展开式中也会被括起来。此外,如果您也给出一个没有这个问题的宏定义,这个答案可能会更好。(以及显而易见的,
define LogToFile(a,b,c)(void)(0)
,将导致参数不再被计算,因此如果您这样做,则会发出警告。)@hvd:谢谢,我修复了上面的输入错误。我没有建议其他实现,因为不清楚OP试图实际完成什么。我想您可以做类似于
#定义日志文件(a、b、c)的操作((void)a,(void)b,(void)c)
,这可能会允许仍然对参数进行求值。谢谢@hvd,现在我没有收到这些警告。
inline void __throw_to_dev_null(const void*, const char*, ... ) {}
#define LogToFile __throw_to_dev_null