[C] kernel.h의 min 매크로에서 "(void) (& _min1 == & _min2)"함수는 무엇입니까?


Answers

include/linux/kernel.h 의 코드는 이것을 "불필요한"포인터 비교라고합니다. 사실 xy 의 유형이 동일 함을 보장하는 엄격한 유형 검사입니다.

여기에 유형이 일치하지 않으면 컴파일 오류 또는 경고가 발생합니다.

Question

kernel.h min은 다음과 같이 정의됩니다.

#define min(x, y) ({                \
    typeof(x) _min1 = (x);          \
    typeof(y) _min2 = (y);          \
    (void) (&_min1 == &_min2);      \
    _min1 < _min2 ? _min1 : _min2; })

나는 그 줄 (void) (&_min1 == &_min2); 이해하지 못한다 (void) (&_min1 == &_min2); 않습니다. 어떤 종류의 점검이나 그런 것입니까?




리눅스 커널은 이와 같은 것들로 가득 차있다. ( "타입 안전"과 다른 유사한 고려 사항을 위해 gcc에 특유의 해킹이 필요 없다.) 나는 아주 나쁜 습관이라고 생각하고 누군가가 당신을 요구하지 않는다면 그것을 따르지 말 것을 촉구한다.

pmg은 해킹의 목적에 대해 옳았습니다. 그러나 정상적인 사람이라면 min((x)<(y)?(x):(y)) .

커널 정의는 하나의 인수가 int 이고 다른 인수가 long 와 같이 많은 올바른 사용법을 배제합니다. 나는 그들이 진짜로 배제하고 싶었던 것이 min(-1,1U) mismatches min(-1,1U) 예 : min(-1,1U) 가 1 인 것을 의심한다. 이것을 주장하는 더 좋은 방법은 ((1?-1:(x))<0)==((1?-1:(y))<0) . gcc 관련 해킹이 필요하지 않습니다.




다음 내용을 설명하는 osnews 을 참조 osnews .

typechecking과 관련이 있습니다.

간단한 프로그램 만들기 :

int x = 10; 
long y = 20; 
long r = min(x, y); 

다음 경고를 표시합니다. 경고 : 고유 포인터 유형 비교




Links