0L을 사용하여 C ++에서 포인터를 초기화 할 수 있습니까?
-
19-09-2019 - |
문제
~ 안에 이 질문 이니셜 라이저는 NULL로 포인터를 설정하는 데 사용됩니다. 값을 사용하는 대신 0
가치 0L
사용. 나는 정확히 사용해야한다는 것을 읽었습니다 0
정확한 NULL 포인터 표현이 구현 별이므로 NULL 포인터의 경우.
사용할 수 있습니다 0L
포팅하는 동안 NULL 원인 문제에 대한 포인터를 설정하려면?
해결책
표준 (4.10.1)에서 :
널 포인터 상수는 정수 유형의 통합 상수 표현 (5.19) rvalue입니다.
그래서 나는 추측한다 0L
괜찮습니다.
다른 팁
제 생각에는 0L
당신이 할당하는 포인터 유형이 길고 크기와 같은 크기라고 믿는다는 사실을 제외하고는 괜찮습니다.
나는 사용한다고 생각한다 NULL
훨씬 더 명확합니다.
C ++ 0X에는 새로운 NULL 포인터 상수가 있습니다. nullptr
유형의 nullptr_t
. 모든 포인터 유형으로 암시 적으로 변환 될 수 있습니다.
그때까지 나는 NULL을 사용하는 것이 좋습니다. 그러나 0과 0L은 내가 들어 본 모든 구현에서 작동합니다.
나는 당신에게 정확한 답을 줄 수는 없지만, 당신의 질문에 대한 정확한 답변이 무엇인지에 관계없이, 포인터를 초기화하는 아이디어 자체는 0L
포인터가 long
, 반드시 사실은 아닙니다.
컴파일러가 그것을 받아들이는지 아닌지, 그리고 그것이 안전한지 아닌지에 관계없이 유효하지 않은 아이디어를 제안하기 때문에 그렇게하지 않을 것입니다.
NULL 포인터 표현은 구현에 따라 다르지만 0 또는 0L은 반드시 구현이 아닙니다. 사용자가 NULL 포인터를 지정할 수있는 방법 일뿐입니다.
나는 Bjarne Stroustrup이 여러 번 그의 선호가 평원 0 (그리고 null이 아닌)을 사용하는 것이라고 지적했다.
나는 NULL을 사용하는 것을 추천하는 사람들과 동의하지 않지만 세 가지 명시된 옵션 중 하나는 실제로 효과가 있습니다. 관용적 인 C ++에서 표준 선택은 0입니다 (아마도 Stroustrup의 선호도이기 때문일 것입니다. http://www2.research.att.com/~bs/bs_faq2.html#null).
0L은 0과 같은 방식으로 적절한 포인터 유형에 암시 적으로 캐스트됩니다. 그것은 조금 이상하게 보이고 실제로 Jesper가 준 이유 때문에 실제로 큰 의미가 없습니다 ..
당신이 사용할 수있는 false
, 0
, 0l
, 0L
, 0ul
, 0u
, 00
, 또는 문자 0을 나타내는 여러 가지 방법. 문자 0은 기본적으로 널 포인터 상수에 해당하는 마법의 기호입니다.
우리가 약간의 값에 대해 이야기하고 있다면 코드가 포인터를 통해 그것을 memcpy-ening했다면, 위에서 언급 한 문제가있을 것입니다.
보너스 질문 : 어떤 유형은 널 포인터 상수가 약간 제로가 아닌가?
나는 null이라고 말한 모든 사람에게 동의해야 할 것입니다. 0을 사용하는 것을 선호하는 사람들에게 내 의견은 당신의 코드가 그것이 의미하는 바를 말해야한다는 것입니다. 원하는 결과는 널 포인터이므로 코드는 그렇게 말해야합니다. 비교를 할 때 더 의미가 있습니다.
if (some_variable == NULL) { ... }
보다 훨씬 명확합니다
if (some_variable == 0) { ... }
32 비트 포인터에 대한 긴 정수 (64 비트) 0L 할당은 문제를 일으킬 수 있습니다. 언급 된 다른 게시물에서와 같이 NULL을 사용하여 Initializse 포인터를 0으로 0으로하십시오.