열기까지 포스트 그레스 코드베이스, 나는 C 코드의 많은 부분이와 포인터를함으로써 기록되는 것을 볼 수있는 -> 같은 방법으로 표기 :C 포인터 표기법
(foo)->next = 5;
내가 그 포인터 표기법이 알고 우선 순위 -> = (* foo). * foo와 같지 않습니다.
그러나 괄호가 변수 이름 밖에 있고 다음 주소를 참조 해제하거나 단순히 코딩 스타일에 고유 한 규칙 일 때 어떤 의미입니까?
열기까지 포스트 그레스 코드베이스, 나는 C 코드의 많은 부분이와 포인터를함으로써 기록되는 것을 볼 수있는 -> 같은 방법으로 표기 :C 포인터 표기법
(foo)->next = 5;
내가 그 포인터 표기법이 알고 우선 순위 -> = (* foo). * foo와 같지 않습니다.
그러나 괄호가 변수 이름 밖에 있고 다음 주소를 참조 해제하거나 단순히 코딩 스타일에 고유 한 규칙 일 때 어떤 의미입니까?
이전에 보지 못했던 코딩 규칙입니다.
하지만 아무 것도 변경되지 않습니다.
(foo)->next = 5;
그것은 안전을 위해 코딩 규칙입니다
foo->next = 5;
의미가 없습니다. 괄호 안의 표현식이 너무 단순하기 때문에 괄호는 아무 효과가 없습니다. 그것은 기본적으로 당신이 볼 수 있듯이, 괄호의 외부 세트입니다,
(*(foo)).next = 5;
입니다. 그것이 프로젝트가 그것을하는 방법이라면, 그것을 위해 가라. 그렇지 않으면, 나는 오히려 끔찍한 것처럼 보이기 때문에 그것을 사용하지 않으려 고합니다.
'(* (foo)). next = 5;' '를 사용 했습니까? –
오. 권리. 적어도 지금은 숙제에 집중할 수없는 이유가 있습니다. 지적 해 주셔서 고마워요. 로버트에게 고쳐 주셔서 감사합니다. –
정확히 동일합니다.
간단한 코드에서 foo는 포인터 일 뿐이며 괄호는 중복됩니다. 가 또는 가 있다면
(foo)->next = 5;
그러나, 고려는 더 복잡한 표현 때문에 foo는이 매크로로 정의 될 수있는 가능성.
그런 경우 컴파일러 오류를 방지하거나 잘못된 우선 순위를 피하기 위해 괄호가 필요할 수 있습니다.
(++get_foo())->next = 5;
또는 일반적인 캐스트 :이 같은 추한 표현으로 변환 상상해 관용적 C 코드 명심하기
((db_record*)foo_ptr)->next = 5;
뭔가 매크로는 종종 추상화 메커니즘으로 사용 된 것을
확장이 괄호 안의 매크로는 문제입니다. IMHO 매크로 호출자의 작업이 아니라 자체 안전을 보장하는 매크로 작업이되어야합니다. –
굉장합니다, 고마워요. 그게 내가 생각한 것인데, 코드베이스의 어디 에나 있기 때문에 특히 이상해 보였다. – mduvall
확장하려면 foo가 매크로 인 경우이 구조를 사용하는 이유는 안전 벨트와 같습니다. C 스타일 가이드 (예 : FreeBSD)가 모든 return 문을 return (x) 형식으로 제안하는 것과 같은 이유입니다. 그냥 x를 반환하는 대신; – Benno
'foo'가 매크로인데, 완전히 괄호로 묶는 것이 현명합니다. '#define foo (blargity-> blah)' –