在使用 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中文网其他相关文章!