升级一些遗留代码,我开始收到“警告:将NULL传递给来自g ++的'Identifier :: Identifier(int)'[-Wconversion-null]”消息的非指针参数1。大多数情况下这是好的,但它似乎没有考虑多个构造函数的类。
例如,请使用此测试代码:
#include <stdio.h>
class Identifier
{
private:
int m_iID;
public:
Identifier(const char* p_c) { m_iID = p_c ? p_c[0] : 0; }
Identifier(int i) { m_iID = i; }
};
int main(int argc, char* argv[])
{
Identifier* p_ID = new Identifier(NULL);
return 0;
}
(请忽略构造函数实际执行的操作,这只是问题的一个例子。对于上下文,有问题的代码是一个以散列值的形式存储标识符的类。构造函数可以采用字符串直接转换为哈希值或哈希值。)
第三行到最后一行的“新”语句会抛出此警告。令我困惑的是,g ++显然假设它需要使用Identifier(int i)构造函数,并忽略Identifier(const char * p_c)构造函数, 指针。< / p>
请注意,将整数更改为无符号整数会导致歧义错误,这是一个32位系统。
我知道指定-Wno-conversion-null可以解决问题,就像传递0或显式地将NULL转换为const char *一样。但我很好奇为什么看似有效的构造函数被忽略了。另外,我希望在保持警告活动的同时避免大量的搜索和替换工作。
答案 0 :(得分:2)
至少在这个CentOS框中,NULL在linux/stddef.h
中定义:
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
因此,C ++ 中的NULL是一个整数;因此,编译器默认选择int
构造函数,并为您提供警告。