2009-09-24 7 views
5

열기까지 포스트 그레스 코드베이스, 나는 C 코드의 많은 부분이와 포인터를함으로써 기록되는 것을 볼 수있는 -> 같은 방법으로 표기 :C 포인터 표기법

(foo)->next = 5; 

내가 그 포인터 표기법이 알고 우선 순위 -> = (* foo). * foo와 같지 않습니다.

그러나 괄호가 변수 이름 밖에 있고 다음 주소를 참조 해제하거나 단순히 코딩 스타일에 고유 한 규칙 일 때 어떤 의미입니까?

답변

6

이전에 보지 못했던 코딩 규칙입니다.

하지만 아무 것도 변경되지 않습니다.

(foo)->next = 5; 

그것은 안전을 위해 코딩 규칙입니다

foo->next = 5; 
+0

굉장합니다, 고마워요. 그게 내가 생각한 것인데, 코드베이스의 어디 에나 있기 때문에 특히 이상해 보였다. – mduvall

+1

확장하려면 foo가 매크로 인 경우이 구조를 사용하는 이유는 안전 벨트와 같습니다. C 스타일 가이드 (예 : FreeBSD)가 모든 return 문을 return (x) 형식으로 제안하는 것과 같은 이유입니다. 그냥 x를 반환하는 대신; – Benno

+1

'foo'가 매크로인데, 완전히 괄호로 묶는 것이 현명합니다. '#define foo (blargity-> blah)' –

1

의미가 없습니다. 괄호 안의 표현식이 너무 단순하기 때문에 괄호는 아무 효과가 없습니다. 그것은 기본적으로 당신이 볼 수 있듯이, 괄호의 외부 세트입니다,

(*(foo)).next = 5; 

입니다. 그것이 프로젝트가 그것을하는 방법이라면, 그것을 위해 가라. 그렇지 않으면, 나는 오히려 끔찍한 것처럼 보이기 때문에 그것을 사용하지 않으려 고합니다.

+0

'(* (foo)). next = 5;' '를 사용 했습니까? –

+0

오. 권리. 적어도 지금은 숙제에 집중할 수없는 이유가 있습니다. 지적 해 주셔서 고마워요. 로버트에게 고쳐 주셔서 감사합니다. –

2

정확히 동일합니다.

간단한 코드에서 foo는 포인터 일 뿐이며 괄호는 중복됩니다. 가 또는 가 있다면

(foo)->next = 5; 

그러나, 고려는 더 복잡한 표현 때문에 foo는이 매크로로 정의 될 수있는 가능성.

그런 경우 컴파일러 오류를 방지하거나 잘못된 우선 순위를 피하기 위해 괄호가 필요할 수 있습니다.

(++get_foo())->next = 5; 

또는 일반적인 캐스트 :이 같은 추한 표현으로 변환 상상해 관용적 C 코드 명심하기

((db_record*)foo_ptr)->next = 5; 

뭔가 매크로는 종종 추상화 메커니즘으로 사용 된 것을

+0

확장이 괄호 안의 매크로는 문제입니다. IMHO 매크로 호출자의 작업이 아니라 자체 안전을 보장하는 매크로 작업이되어야합니다. –