C 라이브러리에 '스로우'가 표시되는 이유는 무엇입니까?
할 때:less /usr/include/stdio.h
(이것은 C 라이브러리일 뿐 C++와는 관계가 없습니다)
알겠습니다.__THROW
몇 가지 함수 선언 후.또한, 몇 가지 기능 위에 있는 코멘트는 '이 기능은 가능한 취소 포인트이므로 다음과 같이 표시되지 않습니다.__THROW
'이게 다 뭘 위한 거지? '
throw
예외 처리를 위한 것입니다.제가 알기로는 C는 지원을 하지 않는 것으로 알고 있습니다.
설명해 주세요.
이 헤더는 해당 벤더의 C 컴파일러와 C++ 컴파일러 간에 공유됩니다.뭘 보셨어요?__THROW
정의되는 것은?
다음과 같은 것이 의심됩니다.
#ifdef __cplusplus
#define __THROW throw()
#else
#define __THROW
#endif
또는 실제 사양의 경우:
#ifdef __cplusplus
#define __THROW(x) throw(x)
#else
#define __THROW(x)
#endif
보시는 바와 같이 C 빌드에서는 아무것도 확장되지 않습니다.C++에서는 기대대로 동작합니다.이를 통해 벤더는 동일한 파일을 재사용할 수 있습니다.
간단히 말하자면, 이것은 완전히 사실이 아니다: "(이것은 C 라이브러리일 뿐이며 C++와는 전혀 관계가 없다.)
C++ 표준 라이브러리에는 C 표준 라이브러리를 사용하는 기능이 포함되어 있습니다.실제 헤더는<cxxx>
어디에xxx
는 C 헤더 이름입니다.즉, C 헤더를 포함합니다.<stdlib.h>
C++에서는, 다음과 같이 합니다.<cstdlib>
C++와 관련이 있습니다. : )
이것이 당신이 코드를 보는 이유입니다.헤더를 2개의 다른 언어로 복제하는 것은 유지 보수와 청결에 악몽이 될 것입니다.
할수있습니다
cpp -include stdlib.h -dM /dev/null |grep '#define __THROW '
실제로 어떤 방향으로 확장되는지 알 수 있습니다.
시스템에서 다음을 얻을 수 있습니다.
#define __THROW __attribute__ ((__nothrow__ __LEAF))
nothrow 속성과 Leaf 속성에 대해서는http://https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Common-Function-Attributes.html#Common-Function-Attributes 에서 다음과 같이 설명합니다.
잎사귀
이 속성을 가진 외부 함수에 대한 리프 콜은 반환 또는 예외 처리를 통해서만 현재 컴파일 장치로 반환해야 합니다.특히 리프 함수는 현재 컴파일 유닛에서 전달된 콜백 함수를 호출하거나 유닛에서 내보낸 함수를 직접 호출하거나 유닛에 longjmp를 호출할 수 없습니다.리프 함수는 다른 컴파일 유닛에서 함수를 호출할 수 있기 때문에 함수 호출이 전혀 포함되어 있지 않다는 점에서 리프라고는 할 수 없습니다.이 속성은 데이터 흐름 분석을 개선하기 위한 라이브러리 기능을 위한 것입니다.컴파일러는 현재 컴파일 유닛을 벗어나지 않는 데이터는 리프 함수에 의해 사용되거나 수정될 수 없다는 힌트를 얻습니다.예를 들어, sin 함수는 리프 함수이지만 qsort는 그렇지 않습니다.
리프 함수는 스태틱 변수를 사용하는 현재 컴파일 유닛에 정의된 신호 핸들러를 간접적으로 실행할 수 있습니다.마찬가지로, 느린 기호 분해능이 유효할 때 리프 함수는 현재 컴파일 단위에 정의되어 정적 변수를 사용하는 분해능 또는 구현 함수의 간접 함수를 호출할 수 있다.이러한 신호 핸들러, 리졸바 함수 또는 구현 함수를 기술하는 표준 준거 방법은 없습니다.최선은 리프 속성을 삭제하거나 이러한 스태틱 변수를 모두 휘발성 마킹하는 것입니다.마지막으로, 기호 개입을 지원하는 ELF 기반 시스템의 경우 현재 컴파일 유닛에 정의된 기능이 정의된 표준 모드 및 정의된 기능 테스트 매크로에 기반하여 예기치 않게 다른 기호를 개입시키지 않도록 주의해야 한다. 그렇지 않으면 의도하지 않은 콜백이 추가될 수 있다.
속성은 현재 컴파일 유닛 내에 정의된 함수에 영향을 주지 않습니다.이를 통해 링크 시간 최적화를 사용하여 여러 컴파일 유닛을 하나의 컴파일 유닛으로 쉽게 병합할 수 있습니다.이 때문에, 간접 콜에 주석을 다는 타입에서는 어트리뷰트를 사용할 수 없습니다.
행하지 않다
nothrow: nothrow 속성은 함수가 예외를 발생시킬 수 없음을 컴파일러에 알리기 위해 사용됩니다.예를 들어, 표준 C 라이브러리의 대부분의 함수는 함수 포인터 인수를 사용하는 qsort 및 bsearch의 주목할 만한 예외와 함께 예외를 발생시키지 않음을 보증할 수 있습니다.
what?__attribute__((nothrow))
c의 평균은 gcc에서 응답됩니다.attribute nothrow는 무엇을 위해 사용됩니까?기본적으로 C++ 코드와의 연계를 위한 것입니다.또, 이 함수가 예외적으로 발생하는 C++ 코드로 콜백 하지 않는 경우에 사용할 수 있습니다.
"이 함수는 취소 가능한 포인트이므로 __THROW로 표시되지 않습니다"와 관련된 기타 질문에 대한 답변: 이 함수는 멀티 스레딩에 대해 설명합니다.스레드는 "취소"할 수 있지만 취소 지점에 도달할 때까지 실제로 "취소"되지 않습니다.기타 정보 : http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cancel.3.html
언급URL : https://stackoverflow.com/questions/2486386/why-do-i-see-throw-in-a-c-library
'programing' 카테고리의 다른 글
VueJ에서 개체 속성별로 개체 배열을 필터링하는 방법s (0) | 2022.08.21 |
---|---|
JS App에서 onReady 약속을 만들려면 어떻게 해야 합니까? (0) | 2022.08.21 |
Vue 2: 렌더 함수에서 단일 파일 컴포넌트를 렌더링하는 방법 (0) | 2022.08.21 |
List와 Array List의 차이점은 무엇입니까? (0) | 2022.08.21 |
vue-signature-pad가 모달로 동작하지 않는 이유는 무엇입니까? (0) | 2022.08.19 |