」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > C/C ++中未使用的變量:為什麼以及如何?

C/C ++中未使用的變量:為什麼以及如何?

發佈於2025-02-06
瀏覽:805

Unused variables in C/C  : why and how? 為什麼變量未使用

有很多原因導致未使用變量可能保留在代碼庫中。這些包括:

錯誤和錯誤

:未使用變量的最明顯原因是有缺陷的代碼。要么根本不需要該變量,因此可以刪除,或者是必要的,但我們忘記了在某些關鍵點使用它。

重構:
    作為軟件的編寫和重新編寫,可以刪除代碼的整個部分。然後,曾經對代碼至關重要的變量,例如輔助計算的結果,可能會被拋在後面,未使用。
  1. 條件彙編:

    變量可能取決於預處理器階段。標準示例是僅出於調試目的而定義的變量。您的代碼可能包含一些表單

  2. const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differy(); assert(value == value_for_comparison_only);

    如果您使用-dndebug編譯,則編譯器可能會警告您value_for_for_comparison_only從未使用過:的確,assert語句已被…沒有。 如何檢測未使用的變量

  3. 不同的編譯器和警告級別設置可能會影響編譯過程中是否沒有使用變量。
  4. 例如,GCC和Clang具有-wunused -variable標誌,它觸發了有關未使用變量的警告。標誌已經由-wall警告選項暗示,並且可以通過-wno -unused -variable關閉。 我的建議是始終使用-wall編譯,然後選擇性地將警告視為允許的。這將所有未使用變量的實例。

    如何不檢測未使用的變量:屬性

    雖然我們始終應啟用盡可能多的警告,但在某些情況下,我們需要選擇性地關閉有關特定未使用變量的警告。這樣做的一種流行的方式是使其無效:
  5. 對象Unused_Object; (void)unused_object; void的演員陣容將變量的用法計數為(pro forma),因此不會發出任何警告。
    雖然刪除了Unused_object未使用的警告,但如有預期,有一些改進的方法。我們希望具有明確的語義,以表示無用的對象。一種常見的方法是通過定義宏:

#定義未使用(x)(void)(x); // ... 對象Unused_Object; 未使用(unused_object);
const auto value = compute_some_value();
const auto value_for_comparison_only = compute_same_value_differently();
assert( value == value_for_comparison_only );
一個優點是,我們現在明確地傳達了此變量的意圖(或缺乏意圖)。此外,如果我們決定清除未使用變量的代碼,那麼搜索它們要容易得多。

超越宏,我們有可變屬性:語言c的本地或作為C/C編譯器提供的語言擴展。例如,clang和GCC允許變量屬性__Attribute __(((未使用))。 C 17支持[[MASE_UNUSED]]屬性:

對象Unused_Object2 __attribute __(((unused)))= x; //應在聲明後放置 [[MASE_UNUSED]]對象Unused_Object1 = X; //必須在聲明之前放置

這些屬性與編譯器(以及我們)交流這些變量可能未使用,並且我們對此很好。

歷史上,海灣合作委員會屬性首先出現,是C和C中的編譯器特定語言擴展。從C 17開始,屬性是語言標準的一部分。但是,不僅拼寫不同,而且標準和GCC擴展不同意將屬性放置在哪裡。

[[MASE_UNUSED]]屬性將通過條件編譯找到其大多數應用程序。例如,它是僅調試變量的自然屬性。出於純粹的美學原因,我個人更喜歡定義一個宏#define and_unused [[bays_unused]]。

__attribute __(((未使用))的優點是,如果代碼中使用該變量,它實際上會警告您。它不是

,但

絕對從未使用過,現在使用變量會產生警告。

保留無用的東西

顯然,未使用的變量頻繁且重要,甚至足以保證自己的語言擴展。
Object unused_object;
(void)unused_object;
從比較中,評論未使用的變量是一個很好的策略?並非總是!在整個開發代碼和調試階段中,您會保留未使用的變量的原因。假設該變量是在過去版本的代碼中使用的,也許您甚至還沒有決定是否應該擱置或重新整合舊代碼;含義:您不知道您是否可能再次需要未使用的變量。

可能有助於調試目的保留代碼:


auto Unused_variable __attribute __(((unused))=複雜的_calculation(arg1,arg2,arg3);
const auto value = compute_some_value();
const auto value_for_comparison_only = compute_same_value_differently();
assert( value == value_for_comparison_only );
即使從未使用複雜的計算結果,將其圍繞它構成了另一個失敗點……這正是您在調試期間想要的。即使不是原本打算調試的目的,如果您決定再次需要它,則該程序初始化此變量也會有所幫助。

我希望這篇關於未使用變量的文章對您有用。

版本聲明 本文轉載於:https://dev.to/martinlicht/unused-variables-in-cc-why-and-how-4cm4如有侵犯,請聯繫[email protected]刪除
最新教學 更多>
  • 如何將多種用戶類型(學生,老師和管理員)重定向到Firebase應用中的各自活動?
    如何將多種用戶類型(學生,老師和管理員)重定向到Firebase應用中的各自活動?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    程式設計 發佈於2025-04-30
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-04-30
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-04-30
  • FastAPI自定義404頁面創建指南
    FastAPI自定義404頁面創建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    程式設計 發佈於2025-04-30
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-04-30
  • 如何高效地在一個事務中插入數據到多個MySQL表?
    如何高效地在一個事務中插入數據到多個MySQL表?
    mySQL插入到多個表中,該數據可能會產生意外的結果。雖然似乎有多個查詢可以解決問題,但將從用戶表的自動信息ID與配置文件表的手動用戶ID相關聯提出了挑戰。 使用Transactions和last_insert_id() 插入用戶(用戶名,密碼)值('test','tes...
    程式設計 發佈於2025-04-30
  • 如何避免Go語言切片時的內存洩漏?
    如何避免Go語言切片時的內存洩漏?
    ,a [j:] ...雖然通常有效,但如果使用指針,可能會導致內存洩漏。這是因為原始的備份陣列保持完整,這意味著新切片外部指針引用的任何對象仍然可能佔據內存。 copy(a [i:] 對於k,n:= len(a)-j i,len(a); k
    程式設計 發佈於2025-04-30
  • 左連接為何在右表WHERE子句過濾時像內連接?
    左連接為何在右表WHERE子句過濾時像內連接?
    左JOIN CONUNDRUM:WITCHING小時在數據庫Wizard的領域中變成內在的加入很有趣,當將c.foobar條件放置在上面的Where子句中時,據說左聯接似乎會轉換為內部連接。僅當滿足A.Foo和C.Foobar標準時,才會返回結果。 為什麼要變形?關鍵在於其中的子句。當左聯接的右側...
    程式設計 發佈於2025-04-30
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-04-30
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-04-30
  • 在Pandas中如何將年份和季度列合併為一個週期列?
    在Pandas中如何將年份和季度列合併為一個週期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 這個目標是通過組合“年度”和“季度”列來創建一個新列,以獲取以下結果: [python中的concate...
    程式設計 發佈於2025-04-30
  • 切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    程式設計 發佈於2025-04-30
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-04-30
  • 在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    mysql-python安裝錯誤:“ mysql_config找不到”“ 由於缺少MySQL開發庫而出現此錯誤。解決此問題,建議在Ubuntu上使用該分發的存儲庫。使用以下命令安裝Python-MysqldB: sudo apt-get安裝python-mysqldb sudo pip in...
    程式設計 發佈於2025-04-30
  • `console.log`顯示修改後對象值異常的原因
    `console.log`顯示修改後對象值異常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    程式設計 發佈於2025-04-30

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

Copyright© 2022 湘ICP备2022001581号-3