首页 > 后端开发 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板