code

Linux에서 조건 연산자의 이상한 사용

starcafe 2023. 8. 1. 20:40
반응형

Linux에서 조건 연산자의 이상한 사용

3.0.4 리눅스 커널에서 mm/filemap.c는 다음과 같은 코드 줄을 갖습니다.

retval = retval ?: desc.error;

저는 gcc-Wall로 유사한 최소 테스트 사례를 컴파일하려고 시도했지만 경고를 받지 않았습니다. 동작은 다음과 같습니다.

retval = retval ? retval : desc.error;

C99 표준을 보면, 저는 이 행동을 공식적으로 설명하는 것이 무엇인지 알 수 없습니다.왜 이것이 괜찮은가요.

몇몇 다른 사람들이 말했듯이, 이것은 GCC 확장이지, 어떤 표준의 일부가 아닙니다.만약 당신이 그것을 사용한다면 당신은 그것에 대해 경고를 받을 것입니다.-pedantic스위치를 켜다

이 확장의 요점은 이 경우에 실제로 보이지 않지만, 대신에 그것이 있었다면 상상해 보십시오.

retval = foo() ?: desc.error;

내선번호를 사용하면,foo()한 번만 호출됩니다.그것이 없으면, 당신은 호출을 피하기 위해 임시 변수를 도입해야 합니다.foo()두번이라.

gcc 확장자입니다.x ?: y와 동등합니다.x ? x : yhttp://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals 을 참조하십시오.

네, 저도 사악하다고 생각합니다.

생략된 피연산자가 있는 조건이라는 GCC 확장입니다.중간 피연산자를 생략하면 조건부 값을 다시 평가하지 않고 생략된 피연산자로 사용할 수 있습니다.조건부가 매크로인 경우에도 안전하게 사용할 수 있습니다.

이것은 C에 대한 gcc 전용 확장이며 표준이 아닙니다.

언급URL : https://stackoverflow.com/questions/7814694/bizarre-use-of-conditional-operator-in-linux

반응형