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

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

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

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]刪除
最新教學 更多>

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

Copyright© 2022 湘ICP备2022001581号-3