> 백엔드 개발 > C++ > C 20에서 표준 라이브러리 함수의 주소를 가져올 수 있나요?

C 20에서 표준 라이브러리 함수의 주소를 가져올 수 있나요?

Patricia Arquette
풀어 주다: 2024-12-30 14:15:16
원래의
544명이 탐색했습니다.

Can I Take the Address of a Standard Library Function in C  20?

표준 라이브러리에 정의된 함수의 주소를 가져올 수 있나요?

소개

C로 작업하는 동안 다음이 가능한지 궁금할 수 있습니다. 표준 라이브러리에 있는 함수의 주소를 얻습니다. 이 질문은 다양한 시나리오에서 해당 기능의 활용에 영향을 미칠 수 있으므로 적절합니다.

질문

다음 코드 조각에서는 std::invoke에 대한 두 번의 호출이 이루어집니다.

std::invoke(std::boolalpha, std::cout); // #1
std::cout << std::invoke(static_cast<ctype_func>(std::tolower), 'A') << '\n'; // #2
로그인 후 복사

이 코드의 예상 출력이 C에서 보장됩니까? 20?

답변

아니요.

설명

표준에 대한 포인터를 형성하려고 시도할 때 C 프로그램의 동작은 명시적으로 정의되지 않습니다. 라이브러리 함수(해당 함수가 주소 지정 가능한 함수로 명시적으로 지정되지 않은 경우) 이는 C 표준의 [namespace.std]에 명시되어 있습니다.

첫 번째 호출

std::invoke에 대한 첫 번째 호출에서는 std::boolalpha에 대한 포인터를 얻으려고 시도합니다. . 운 좋게도 [fmtflags.manip]이 우리를 구해주었습니다.

Each function specified in this subclause is a designated addressable function ([namespace.std]).
로그인 후 복사

std::boolalpha는 실제로 이 하위 절에 지정된 함수로, 이 줄을 형식이 잘 맞고 다음과 동일하게 만듭니다.

std::cout.setf(std::ios_base::boolalpha);
로그인 후 복사

두 번째 호출

아쉽게도 두 번째 호출의 경우 [cctype.syn]

The contents and meaning of the header <cctype> are the same as the C standard library header <ctype.h>.
로그인 후 복사

이 표준 라이브러리 헤더의 어느 곳에서도 std::tolower가 주소 지정 가능한 함수로 명시적으로 지정되어 있지 않습니다. 따라서 이 C 프로그램의 동작은 정의되지 않았으며 잠재적으로 컴파일 오류가 발생할 수 있습니다.

결론

이 코드의 예상 출력은 보장되지 않으며 코드가 성공적으로 컴파일되지 않을 수도 있습니다. std::tolower의 주소를 가져오는 것과 관련된 정의되지 않은 동작입니다.

또한 이는 표준 라이브러리 함수뿐만 아니라 C에서 선언된 멤버 함수에도 적용됩니다. 표준 라이브러리. 이러한 멤버 함수의 주소를 취하면 정의되지 않은 동작이 발생합니다.

위 내용은 C 20에서 표준 라이브러리 함수의 주소를 가져올 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿