2012-10-29 4 views
0

이것이 C에서 NULL을 올바르게 사용합니까? 아니면이 문제를 해결할 다른 방법이 있습니까?Java에서 NULL처럼 C에서 NULL 포인터를 사용합니까?

// Send data 
// cb_push returns NULL if it is successful 
char uart_send(char c) { 
    void* ret = cb_push(w_buffer, &c); 
    if (ret != NULL) return c; 

    SETBIT(UCSR0B, UDRIE0); 
    return NULL; 
} 

Java에서 나는 이런 식으로 일을하지만, C에서는 무엇이 좋은 연습인지 모르겠다.

+1

'NULL'은 대개 단지 0이므로 기술적으로 null 문자를 반환합니다 (포인터 관점과 다릅니다). – chris

+0

@chris 또는'((void *) 0'이면 진단을 받게됩니다.) –

+1

'NULL'이 빈번한 경우'return' 문은 무효가됩니다 – ouah

답변

2

실제로 정의되지 않았으며 사용중인 라이브러리 및/또는 기능에 따라 다른 접근 방식이 있습니다. 일반적으로 0NULL을 구별 할 수있는 방법은 없습니다 (실제로 NULL은 보통 0으로 확장되는 전처리 매크로입니다). 다음 가능성, 사용 일반적으로

은 때로는 용도에 따라 하나의 라이브러리 내에서 일치 : 포인터가 returnd가

  • 경우, 0의 반환 값은 일반적으로 어떤 종류의 오류를 나타냅니다.
  • 상태 코드 (또는 main 진입 점)가있는 함수는 일반적으로 오류가없는 경우에 0을 반환합니다.
  • 뭔가 성공하지 못한 경우 (즉 부울 값을 반환하는 경우) 0을 반환하는 함수가 있습니다.
  • 일부 stdlib 문자열 함수는 오류가 있거나 (찾을 수없는 경우) "불합리한"값을 반환합니다. 예를 들어 std::string::find()은 하위 문자열을 찾을 수없는 경우 -1을 반환합니다. 그러나 이것은 "magic values"를 피하기 위해 상수라는 값 (std::string::npos) 뒤에 감싸거나 숨겨져 있습니다.

완벽한 방법이 있습니까? 나는 그렇게 생각하지 않지만 실제로는 특정 유스 케이스에 달려있다. 포인터를 반환하면 실수시 0을 반환하면됩니다. 상태 코드를 반환하는 경우 매크로 (Windows API와 유사) 또는 enum을 사용합니다. 특정 값에 대해서도 걱정하지 마십시오. 이름 만 사용하십시오.

0

일반적으로 C 규칙은 성공하면 0을 반환하고 그렇지 않으면 음수를 반환합니다.

또한 함수가 포인터를 반환한다고 가정하고 그렇게하지 못한 경우 NULL을 반환하는 것이 규칙입니다.

관련 문제