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 중국어 웹사이트의 기타 관련 기사를 참조하세요!