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
'programing' 카테고리의 다른 글
pyplot 하위 그림에 대한 공통 축 레이블 (0) | 2022.10.02 |
---|---|
View의 SELECT는 FROM 절에 하위 쿼리를 포함합니다. (0) | 2022.10.02 |
양식을 제출할 때 모든 POST 결과를 인쇄하려면 어떻게 해야 합니까? (0) | 2022.10.01 |
python module docstring에 넣을 내용 (0) | 2022.10.01 |
Jar/war에서 파일을 빠르게 삭제할 수 있는 방법이 있습니까? Jar/war를 추출하여 다시 만들지 않아도 됩니다. (0) | 2022.10.01 |