ANSIC에서 복합 문(블록)이 부모 표현식으로 둘러싸여 있습니까?
Linux 커널 소스를 탐색하면서 괄호로 둘러싸인 문 블록이 식으로 처리되는 코드 조각을 발견했습니다. 즉, 마지막 문의 값이 어떤 식인지를 나타냅니다.
예:
int a = ({
int i;
int t = 1;
for (i = 2; i<5; i++) {
t*=i;
}
t;
});
저는 이 코드 조각이 파스 트리에 어떻게 들어맞을지 알아내려고 ANSIC 문법을 봐왔지만, 성공하지 못했습니다.
그렇다면, 이 행동이 표준에 의해 의무화되었는지 아니면 단지 GCC의 특수성인지 아는 사람이 있습니까?
업데이트: 플래그 페디틱으로 시도해 보았는데 컴파일러가 이제 경고를 줍니다.
warning: ISO C forbids braced-groups within expressions
이것은 표준 C가 아닙니다.문 표현식이라고 하는 gcc 확장자입니다.C 확장의 전체 목록은 여기에서 찾을 수 있습니다.이것은 실제로 리눅스 커널에서 사용되는 많은 gcc 확장 중 하나이며 clang도 이를 지원하는 것으로 보이며 문서에서 명시적으로 이름이 지정되지는 않았습니다.
마지막 표현식이 표현식의 값으로 사용되는 것을 보았듯이 문서에는 다음과 같이 표시됩니다(내 것 강조).
복합 문의 마지막은 식 뒤에 세미콜론이 와야 합니다. 이 하위 표현식의 값은 전체 구문의 값으로 사용됩니다. (괄호 안에서 마지막으로 다른 종류의 문을 사용하는 경우 구문은 void 형식이므로 사실상 값이 없습니다.)
주요 이점 중 하나는 부작용이 있는 인수의 다중 평가를 피할 수 있는 안전한 매크로를 만드는 것입니다.해당 예제에서는 다음과 같은 안전하지 않은 매크로를 사용합니다.
#define max(a,b) ((a) > (b) ? (a) : (b))
둘 중 하나를 평가합니다.a
또는b
다음과 같은 문 식을 사용하여 이 문제를 제거하기 위해 다시 작성할 수 있습니다.
#define maxint(a,b) \
({int _a = (a), _b = (b); _a > _b ? _a : _b; })
참고: 명시적으로 사용할 필요성int
다른 것을 사용하여 고칠 수 있습니다.gcc
확장 유형:
#define max(a,b) \
({ typeof (a) _a = (a), _b = (b); _a > _b ? _a : _b; })
clang은 다음 유형도 지원합니다.
그것은 "표현 내의 브레스-그룹"이라고 불립니다.
ANSI/ISOC 또는 C++에서 허용되지 않지만 gcc에서 지원합니다.
언급URL : https://stackoverflow.com/questions/1238016/are-compound-statements-blocks-surrounded-by-parens-expressions-in-ansi-c
'programing' 카테고리의 다른 글
Java Oracle 예외 - "목록의 최대 식 수는 1000개입니다." (0) | 2023.07.05 |
---|---|
'--color' 및 '--format specdoc' 옵션을 설정한 상태로 유지하도록 RSpec을 글로벌하게 구성하려면 어떻게 합니까? (0) | 2023.07.05 |
여기서 count(col) > (0) | 2023.07.05 |
Docker를 사용하는 MongoDB "첫 번째 연결 시 서버 [localhost:27017]에 연결하지 못했습니다." (0) | 2023.07.05 |
신뢰할 수 있는 Excel 범위 구문 참조 (0) | 2023.07.05 |