일부 레거시 코드 업그레이드 중 "경고 : 'Identifier :: Identifier (int)'의 비 포인터 인수 1에 NULL 전달 [-Wconversion-null ] "g ++의 메시지. 대부분이 방법이 좋지만 여러 생성자가있는 클래스를 고려하지는 않습니다.-Wconversion-null이 모든 생성자를 고려하지 않음
예를 들어,이 테스트 코드를 가지고 :
#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) 생성자를 사용할 필요가 있다고 가정하고 식별자 (const char * p_c) 생성자를 무시합니다. 은 포인터입니다.
int를 부호없는 정수로 변경하면 대신 32 비트 시스템 인 모호성 오류가 발생합니다.
-Wno-conversion-null을 지정하면 0을 전달하거나 명시 적으로 NULL을 const char *로 캐스팅하는 것처럼 문제를 해결할 수 있습니다. 하지만 외관상으로 유효한 생성자가 무시되는 이유에 대해 궁금합니다. 또한 경고를 계속 유지하면서 엄청난 검색 및 교체 작업을 피하고 싶습니다.
하지만 포인터를 설정하는 것도 유효합니다 (여기에 내 Xubuntu 상자의 __null입니다). – subi211
사실, Subi211은 컴파일러가 경고하는 * 이유 *입니다. 코드에서'NULL'을 사용하여 포인터 관련 함수를 사용하려고했지만 C++ 규칙은 컴파일러가 선택해야하는 'int'생성자라고 말합니다. 아마 당신이 의도 한 것이 아니기 때문에 컴파일러가 경고합니다. 'NULL'은 포인터에 할당 가능하지만, 처음에는'int'입니다. –
@ subi211 C++ 11을 사용할 수 있으면 NULL 대신 nullptr을 사용할 수 있습니다. –