2

升级一些遗留代码后,我开始收到来自 g++ 的“警告:将 NULL 传递给 '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;
}

(请忽略构造函数的实际作用,这只是问题的一个说明。对于上下文,有问题的代码是一个以哈希值形式存储标识符的类。构造函数可以将字符串转换为散列,或直接散列值。)

倒数第三行的“new”语句会引发此警告。令我困惑的是 g++ 显然假设它需要使用 Identifier(int i) 构造函数,而忽略了 Identifier(const char* p_c) 构造函数,它一个指针。

请注意,将整数更改为无符号整数会导致歧义错误,这是 32 位系统。

我知道指定 -Wno-conversion-null 可以解决问题,就像传递 0 或将 NULL 显式转换为 const char* 一样。但我很好奇为什么看似有效的构造函数被忽略了。另外,我想避免大量的搜索和替换工作,同时保持警告处于活动状态。

4

1 回答 1

2

至少在这个 CentOS 机器上,NULL 定义在linux/stddef.h

#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif

因此,C++ 中的 NULL一个整数;因此编译器int默认选择构造函数并给你你看到的警告。

于 2013-01-16T12:56:15.143 回答