programing

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

minecode 2022. 10. 1. 14:17
반응형

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

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);

는 보증된 "no-op"입니다.그래서 거기에 있는 유일한 이유는 그것의 부작용 때문입니다.

하지만 그 진술은 부작용이 없다!

, 컴파일러는 및 타입이 호환되지 않을 경우 Diagnostics를 발행합니다.
에서는, 「」를 사용해 주세요._min1 == _min2값 중 하나를 다른 유형으로 암묵적으로 변환합니다.

그래서 그게 하는 일이군요.컴파일 시 및 의 유형이 호환되는지 확인합니다.

include/linux/kernel.h의 코드는 이를 "불필요한" 포인터 비교라고 합니다.이것은 실제로는 엄격한 타입 체크이며, 그 타입이x ★★★★★★★★★★★★★★★★★」y똑같아요.

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

타입 체크가 이 있는 과 호환성이 합니다.gcc는 그렇지 않은 경우에 대한 경고를 제공합니다.

포인터 간의 평등은 초안 C99 표준 섹션의 호환 가능한 유형이어야 한다는 것을 알 수 있습니다.6.5.9 다음을 나타내는 등식 연산자:

다음 중 하나가 유지되어야 한다.

및 다음이 포함됩니다.

양쪽 오퍼랜드가 호환 가능한 유형의 정규 버전 또는 비적격 버전에 대한 포인터입니다.

섹션에서는 호환성이 있는 타입을 찾을 수 있습니다.6.2.7 다음과 같은 호환 유형복합 유형:

두 유형의 유형이 동일한 경우 호환되는 유형이 있습니다.

osnews에 대한 이 논의에서는 이 부분에 대해서도 다루고 있으며, 동일한 코드 샘플을 가진 Linux 커널 기사의 GCC 해킹에서 영감을 받았습니다.답은 다음과 같습니다.

타이프 체크와 관련이 있어요

간단한 프로그램 만들기:

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

다음 경고를 표시합니다. 경고: 개별 포인터 유형 비교에 캐스팅이 없습니다.

자세한 것은, http://www.osnews.com/comments/20566 를 참조해 주세요.

활자 검사와 관련이 있습니다.

간단한 프로그램 만들기:

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

다음 경고를 표시합니다. 경고: 개별 포인터 유형 비교에 캐스팅이 없습니다.

여기에서 답을 찾았습니다.

그는 타이프 체크와 관련이 있다.간단한 프로그램 만들기:

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

다음 경고를 표시합니다. 경고: 다른 포인터 유형의 비교에 캐스팅이 없습니다."

Linux 커널은 이런 것들로 가득합니다('타입 안전' 및 기타 유사한 고려사항들을 위해 gracuitous gcc 고유의 해킹). 저는 이것이 매우 나쁜 관행이라고 생각하며 누군가가 요구하지 않는 한 그것을 따르지 말라고 촉구합니다.

해킹의 목적에 대해서는 pmg가 옳지만, 제정신이라면 누구나 정의했을 겁니다.min~하듯이((x)<(y)?(x):(y)).

커널 정의에서는 예를 들어 하나의 인수가 다음과 같이 많은 올바른 사용법을 사용할 수 없습니다.int또 하나는long나는 그들이 정말로 배제하고 싶었던 것은 서명된 불일치일 것이라고 추측한다. 예를 들어, 여기서min(-1,1U)이것을 단언하는 더 좋은 방법은 컴파일 타임 단언을 사용하는 것입니다.((1?-1:(x))<0)==((1?-1:(y))<0). gcc 고유의 해크는 필요 없습니다.

언급URL : https://stackoverflow.com/questions/5595593/what-is-the-function-of-void-min1-min2-in-the-min-macro-in-kernel-h

반응형