>백엔드 개발 >C++ >`std::tolower`와 같은 표준 라이브러리 함수의 주소를 가져올 수 있나요?

`std::tolower`와 같은 표준 라이브러리 함수의 주소를 가져올 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-17 20:22:13493검색

Can I Take the Address of a Standard Library Function Like `std::tolower`?

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

표준 C 함수는 강력한 도구이지만 구문과의 상호 작용 std::invoke와 같이 때때로 예상치 못한 동작이 드러날 수 있습니다. 다음 코드를 고려하십시오.

#include <cctype>
#include <functional>
#include <iostream>

int main() {
    std::invoke(std::boolalpha, std::cout); // #1

    using ctype_func = int(*)(int);
    char c = std::invoke(static_cast<ctype_func>(std::tolower), 'A'); // #2
    std::cout << c << "\n";
}

std::boolalpha를 사용하여 std::invoke에 대한 첫 번째 호출이 예상대로 작동하여 std::cout.setf(std::ios_base::boolalpha가 호출됩니다. ) 및 부울 출력 형식을 설정합니다. 그러나 std::tolower를 사용한 두 번째 호출은 우려를 낳습니다.

예상 출력이 보장됩니까?

불행히도 이 코드의 예상 출력은 아닙니다. C 20에서 보장됩니다. [namespace.std](https://en.cppreference.com/w/cpp/header/namespace/std), 표준 라이브러리 함수의 주소를 사용하는 것은(주소 지정 가능으로 지정되지 않은 경우) 정의되지 않은 동작입니다. std::tolower 함수가 이 범주에 속합니다.

왜 그럴까요?

그 이유는 C 표준 라이브러리 헤더 C 에 그대로 포함되어 있습니다. 이는 tolower와 같은 표준 C 함수의 동작이 주소 가져오기를 구체적으로 금지하는 C 표준과 일치해야 함을 의미합니다.

결론

결론적으로, std::tolower는 C 코드 조각에서 주소 지정 가능한 속성을 가진 표준 라이브러리 함수와 유사하게 동작하며, C 함수로서의 기본 구현은 주소를 정의되지 않은 동작으로 만듭니다. 이 동작은 std::tolower에만 국한된 것이 아니지만 주소 지정 가능으로 명시적으로 지정되지 않은 모든 표준 라이브러리 함수에 적용됩니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.