首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板