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