programing

ANSIC에서 복합 문(블록)이 부모 표현식으로 둘러싸여 있습니까?

mailnote 2023. 7. 5. 20:54
반응형

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

반응형