목적

2014-07-11 3 views

답변

4

이가 사용된다 전 처리기가 텍스트 대체로 처리하는 매크로 정의. 텍스트 대체라는 사실은 이상한 표현을 초래할 수 있습니다. 괄호와

p + 20->ki_filp = (filp); 

:가로 변신, 괄호없이

p = &a_struct_array[10]; 
init_sync_kiocb(p + 20, filp) 

: 고려

(p + 20)->ki_filp = (filp); 

내가 할 수 없었다,하지만 난 비슷한 예를 찾을 수있다 내기 filp 너무, 또는 적어도 당신은 절대 모릅니다.

2

왼쪽 편 x은 매크로 매개 변수이므로 일반적인 안전 조치 일뿐입니다. "구조체 포인터가되어야하는 것은 보호되지 않으면"-> 연산자가 실패하게하는 부분으로 확장 될 수 있습니다.

오른쪽은 나에게 덜 분명하지만 일관성과 대칭성을 이유로 수행 될 수 있습니다. 항상 매크로 인수를 괄호로 보호하십시오. 어떤 사람들은 이것을 어려운 규칙으로 간주하고 아마도 프로젝트의 스타일 가이드도 마찬가지입니다.

1

이 매크로가 기능 매크로 확장의 일부라는 것을 잊지 마십시오. 전달 된 표현식이 복잡한 경우 버그를 피하기 위해 이러한 매개 변수는 항상 괄호로 묶어야합니다.

2

매크로 안에 있습니다. 이것은 일반적이며 좋은 습관입니다. 예를 들어 매크로 init_sync_kiocb을 호출한다고 가정 해 보겠습니다. 이 매크로 확장이 잘못된 것 괄호없이

(pp?*pp:&x)->ki_filp = (fil?fil:somfil+1); 

로 확장됩니다 괄호 (입력 오류 또는 구문 분석 오류)와

init_sync_kiocb(pp?*pp:&x,fil?fil:somfil+1); 

는 :

pp?*pp:&x->ki_filp = fil?fil:somfil+1; 
+0

이 경우에는 정상적으로 작동합니다. 나는 방금 같은 것을 생각한 샘플 프로그램을 썼다. 그러나 원하는대로 작동하고있었습니다. a = 3> 5? 1 : 0이 연산으로 a의 값은 0이됩니다. –