關於不完全類型的認識

来源:https://www.cnblogs.com/style--moon/archive/2022/06/28/16420992.html
-Advertisement-
Play Games

前言 嗨嘍,大家好呀!這裡是魔王吶~ 環境使用: Python 3.8 Pycharm 模塊使用: requests >>> pip install requests 數據請求模塊 parsel >>> pip install parsel 數據解析模塊 csv 內置模塊 如果安裝python第三方 ...


最近在使用libusb做USB驅動,編寫代碼的時候發現了一段有趣的代碼

typedef struct libusb_device libusb_device;

而這個結構體是沒有定義的,在我做出如下定義時編譯器會報錯: error C2079: “dev”使用未定義的 struct“CMW7300ISPTOOLDlg::OnBnClickedButton1::libusb_devic”

struct libusb_devic dev;

而定義為struct libusb_devic* dev;則不會報錯,這是為什麼呢?

網路搜索看到說這個屬於不完全類型,typedef struct libusb_device libusb_device;這斷代碼相當於申明瞭一個結構體libusb_device,但是沒有實際定義,類似於C語言的extern int A;在不使用申明的變數時,編譯器是不會報錯的,但是如果要使用的話,就需要先定義變數,比如要使用給A賦值2,就需要用int A = 2;直接使用A = 2編譯器就會報錯。同樣的對於不完全定義的結構體typedef struct libusb_device libusb_device;而言也是一樣的,不能直接定義struct libusb_devic dev;這樣定義的話編譯器不知道結構體的libusb_devic的大小,不知道開闢多少記憶體給變數,所以會報錯,但是如果用struct libusb_devic* dev;就沒問題了,因為這樣定義的是一個指針,對於編譯器而言,指針的大小是確定的(32位)4位元組。

這裡又出現一個新問題,這樣定義之後在使用這個結構體的時候還是需要先定義如下結構體:

struct libusb_devic

{

  若幹變數;

}

那麼這個不完全類型的意義何在呢?後來發現主要是封裝時使用,當我們不希望別人訪問和修改結構體內容的時候,我們就可以將結構體的定義封裝成庫,那麼別人調用庫的時候只能使用不完全類型作為介面,這樣就沒法訪問結構體成員了,更不能修改結構體內容了。比如如下代碼

ssize_t LIBUSB_CALL libusb_get_device_list(libusb_context *ctx,
libusb_device ***list);

這就是libusb庫中的一個函數,其參數libusb_device ***list是個封裝在庫裡面的結構體,當我們要調用這個函數的時候,就需要先定義一個不完全變數struct libusb_device** device_list;,再調用函數libusb_get_device_list(NULL, &device_list);

這是我們是無法通過device_list->menber的方式訪問結構體成員的,整個結構體對於用戶來說就是一個黑匣子。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一. NIO 基礎 non-blocking io 非阻塞 IO 1. 三大組件 1.1 Channel & Buffer channel 有一點類似於 stream,它就是讀寫數據的雙向通道,可以從 channel 將數據讀入 buffer,也可以將 buffer 的數據寫入 channel,而之 ...
  • ​點擊藍色“程式員黃小斜”關註我喲 加個“星標”,每天和你一起多進步一點點! 本文來源 | 程式員求職面試(ID:CoderJob) 內容參考自 | 脈脈 近日,有位阿裡員工發帖稱,自己手下有兩個應屆生,985本碩和985本,但兩人無論性格、技術,還是家境都不一樣,問大家如何選擇。 原貼如下: 有不 ...
  • 面試官:看你簡歷上面寫著精通MySQL,我問你一個MySQL鎖相關的問題,你看一下這條SQL會對哪些數據加鎖? ...
  • 使用 Java 編譯項目時產生的報錯 java: Compilation failed: internal java compiler error 錯誤原因 導致這個錯誤的原因主要有三點: 編譯版本不匹配 JDK 版本不支持 記憶體不足 解決辦法 對於編譯版本不匹配,我們要先查看 IDEA 的編譯的 ...
  • 前言 嗨嘍,大家好!這裡是魔王吶~ 環境使用: Python 3.8 解釋器<運行代碼> Pycharm 編輯器 <寫代碼> 模塊使用]: requests >>> 數據請求 第三方模塊 pip install requests <工具> re <正則表達式模塊> 如果安裝python第三方模塊: ...
  • ​一、4數種類分析 統計分析 從標有1-10的數字的10個小球中取出1個小球記錄小球的數字,然後將小球放回,如此反覆4次取出4小球的數字組成的序號一共有多少種。註意:1.1.8.9 和1.8.1.9 算是一種。 需要分為一下幾種情況: 四個小球數字都相等情況: 一個有10種 三個小球數字相等: 一共 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • spring框架應用的是ioc模式,ioc模式是指控制反轉模式,本質是你不去創建對象讓spring框架給你創建對象你去使用對象。多種開發模式通過配置文件和註解的方式去開發的都很值得去學習 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...