2013-01-16 2 views
2

일부 레거시 코드 업그레이드 중 "경고 : '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 *로 캐스팅하는 것처럼 문제를 해결할 수 있습니다. 하지만 외관상으로 유효한 생성자가 무시되는 이유에 대해 궁금합니다. 또한 경고를 계속 유지하면서 엄청난 검색 및 교체 작업을 피하고 싶습니다.

답변

2
적어도이 CentOS는 상자, NULL이 linux/stddef.h에 정의

: 예 C++에서 NULL로

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

는 정수이고; 따라서 컴파일러는 기본적으로 int 생성자를 선택하고 표시되는 경고를 제공합니다.

+0

하지만 포인터를 설정하는 것도 유효합니다 (여기에 내 Xubuntu 상자의 __null입니다). – subi211

+1

사실, Subi211은 컴파일러가 경고하는 * 이유 *입니다. 코드에서'NULL'을 사용하여 포인터 관련 함수를 사용하려고했지만 C++ 규칙은 컴파일러가 선택해야하는 'int'생성자라고 말합니다. 아마 당신이 의도 한 것이 아니기 때문에 컴파일러가 경고합니다. 'NULL'은 포인터에 할당 가능하지만, 처음에는'int'입니다. –

+0

@ subi211 C++ 11을 사용할 수 있으면 NULL 대신 nullptr을 사용할 수 있습니다. –

관련 문제