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
'code' 카테고리의 다른 글
| 패키지에 나열된 모든 종속성을 제거하는 방법은 무엇입니까?json(NPM)? (0) | 2023.08.01 |
|---|---|
| XML 파일 내용을 업데이트하는 PowerShell 스크립트 (0) | 2023.08.01 |
| C에서 변수 사용을 등록하는 좋은 예는 무엇입니까? (0) | 2023.08.01 |
| strln이 NULL을 확인하지 않음 (0) | 2023.08.01 |
| 2.0 asmx 웹 서비스에서 JSON을 반환하는 방법 (0) | 2023.08.01 |