」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > C++ 可以將空指標轉換為函式指標嗎?

C++ 可以將空指標轉換為函式指標嗎?

發佈於2024-11-12
瀏覽:790

Can C   Convert a Void Pointer to a Function Pointer?

將空指針轉換為函數指針:C 中的條件可能性

問題

透過dlsym() 取得空指針,目標是呼叫該指標引用的函數。與 C 風格的強制轉換不同,嘗試使用 static_cast 或 reinterpret_cast 進行強制轉換已失敗。

答案

在 C 98/03 中不允許將 void 指標直接轉換為函數指標。然而,C 0x 提供了條件支持,允許實現來決定行為。

未定義的行為方法:

雖然標準未定義,但以下程式碼可能適用大多數平台:

void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));

或:

fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;

複雜但可移植的方法:

此方法利用了函數指標的位址是物件指標的事實:

// Get address as object pointer
void (**object_ptr)() = &my_ptr;

// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast(object_ptr);

// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;

此方法在標準中仍未定義,但在大多數實作上應該運行得相當好。

最新教學 更多>
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-17
  • 為什麼 Go 中 rune 是 int32 的別名而不是 uint32?
    為什麼 Go 中 rune 是 int32 的別名而不是 uint32?
    為什麼 rune 是 Go 中 int32 的別名,而不是 uint32? 儘管 rune 類型的主要目的是表示字元值,但 rune 類型Go 中沒有定義為 uint32 的別名。相反,它是 int32 的別名。鑑於字元通常由正值表示,此選擇似乎違反直覺。 此決定背後的基本原理源於符文作為 Unic...
    程式設計 發佈於2024-11-17
  • 在 Spans 中使用「float: right」時如何保留 HTML 順序?
    在 Spans 中使用「float: right」時如何保留 HTML 順序?
    使用Float:right 反轉Span 順序使用Float:right 反轉Span 順序在提供的HTML 中,具有「button」類別的Span 的樣式為「float : right” ,”導致它們以與HTML 結構相反的順序顯示。順序?不要直接浮動span 元素,而是將它們包裝在包含元素中並將...
    程式設計 發佈於2024-11-17
  • 如何將 SDL2 和 SDL_image 與 CMake 一起用於 C++ 專案?
    如何將 SDL2 和 SDL_image 與 CMake 一起用於 C++ 專案?
    在CMake中使用SDL2和SDL_image在這篇文章中,我們深入研究了在CMake中使用SDL2圖形庫和SDL_image擴展的步驟您的C 專案在CMake 的幫助下。 配置專案並依賴項project(shooter-cmake2) cmake_minimum_required(VERSION ...
    程式設計 發佈於2024-11-17
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-17
  • 為什麼我在 Django 資料庫查詢中收到「InterfaceError (0, \'\')\」?
    為什麼我在 Django 資料庫查詢中收到「InterfaceError (0, \'\')\」?
    在Django 查詢執行中遇到InterfaceError (0, '')Django 使用者可能會遇到持久的「InterfaceError (0 , '')” "嘗試資料庫操作時出錯,特別是在伺服器重新啟動後。資料庫的持久連接,在多個資料庫中保持開啟狀態運...
    程式設計 發佈於2024-11-17
  • MySQL 中的分片真的是大型資料集的最佳方法嗎?
    MySQL 中的分片真的是大型資料集的最佳方法嗎?
    MySQL 中的分片:一種關鍵方法在優化MySQL 資料庫時,分片作為處理大型資料集的潛在解決方案而出現。然而,在實施分片之前了解與分片相關的權衡和潛在陷阱至關重要。 最佳方法:不分片與普遍看法相反,除非絕對必要,否則對 MySQL 表進行分片的最佳方法是避免這樣做。為什麼?分片帶來了重大的技術挑戰...
    程式設計 發佈於2024-11-17
  • 如何在 MySQL SELECT 查詢中使用 IF 語句:語法與最佳實務指南
    如何在 MySQL SELECT 查詢中使用 IF 語句:語法與最佳實務指南
    MySQL SELECT 查詢中的IF 語句用法嘗試在MySQL SELECT 查詢中實現IF 語句時,您可能會遇到困難,因為具體語法要求。在 MySQL 中,傳統的 IF/THEN/ELSE 結構僅在預存程序和函數中可用。 要解決此問題,重構查詢至關重要。查詢中支援的 IF() 函數主要用於根據 ...
    程式設計 發佈於2024-11-17
  • 如何在Python中產生特定範圍內的唯一隨機數?
    如何在Python中產生特定範圍內的唯一隨機數?
    產生範圍內的唯一隨機數產生隨機數時,確保每個數字都是唯一的可能是一個挑戰。雖然可以使用條件語句來檢查重複項,但在處理大範圍或大數字時,這種方法會變得很麻煩。 產生唯一隨機數字列表的簡單方法是使用 Python 的 random.sample( ) 功能。此函數有兩個參數:總體(產生隨機數的數字範圍)...
    程式設計 發佈於2024-11-17
  • 如何使用佔位符和參數執行帶有“WHERE...IN”的 PDO 查詢?
    如何使用佔位符和參數執行帶有“WHERE...IN”的 PDO 查詢?
    PDO 查詢“WHERE...IN”為了使用PDO 增強數據庫訪問,許多開發人員遇到了挑戰,特別是“WHERE...IN” IN”查詢。讓我們深入研究其中的複雜性,並發現在PDO 準備好的語句中使用項目列表的正確方法。“WHERE... IN”難題考慮一個場景,您需要根據表單中已檢查項目的清單從資料...
    程式設計 發佈於2024-11-17
  • 如何有效率地存取和刪除Python字典中的任意元素?
    如何有效率地存取和刪除Python字典中的任意元素?
    存取 Python 字典中的任意元素在 Python 中,字典將鍵值對儲存在無序集合中。如果字典不為空,則可以使用下列語法存取任意(隨機)元素:mydict[list(mydict.keys())[0]]但是,這這種方法可能冗長且低效,特別是當您需要執行多次迭代時。讓我們探索更有效的方法來實現此目的...
    程式設計 發佈於2024-11-17
  • 如何使用 jQuery 製作背景顏色動畫?
    如何使用 jQuery 製作背景顏色動畫?
    使用 jQuery 淡化背景顏色引人注目的網站元素通常需要微妙的動畫,例如淡入和淡出。雖然 jQuery 廣泛用於動畫文字內容,但它也可用於動態增強背景顏色。 在 jQuery 中淡入/淡出背景顏色進行操作要使用 jQuery 設定元素的背景顏色,您首先需要合併 jQueryUI 函式庫。整合後,可...
    程式設計 發佈於2024-11-17
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-17
  • 在 Go 中嵌入結構:指標還是值?何時使用哪一個?
    在 Go 中嵌入結構:指標還是值?何時使用哪一個?
    Go 中嵌入結構:何時使用指標Go 中嵌入結構:何時使用指標當考慮將一個結構嵌入另一個結構時,決定是否使用指標或出現嵌入字段的值。本文探討了這種實現選擇的細微差別,並提供範例來說明潛在的好處和影響。 透過指標嵌入Go 規範允許將結構體嵌入為指標或價值。對於非介面類型,允許將匿名欄位指定為類型名稱 T...
    程式設計 發佈於2024-11-17
  • 如何解決在 MySQL 中將 @GenerateValue GenerationType.TABLE 與多態抽象超類別一起使用時出現「'where 子句'中的未知列 'sequence_name'」錯誤?
    如何解決在 MySQL 中將 @GenerateValue GenerationType.TABLE 與多態抽象超類別一起使用時出現「'where 子句'中的未知列 'sequence_name'」錯誤?
    @GeneratedValue MySQL 上的多態抽象超類別@GeneratedValue MySQL 上的多態抽象超類別在使用Hibernate 和MySQL 的Spring MVC 應用程式中,我們發現嘗試持久化抽象化抽象BaseEntity 的超類BaseEntity子類,遇到「表'...
    程式設計 發佈於2024-11-17

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3