C/C コードをレビューすると、使用されていない変数が頻繁に見つかります。このような未使用の変数は、さまざまな理由で発生します。この投稿では、C/C コードで未使用の変数が発生する最も一般的な原因のいくつかを見ていきます。未使用の変数についてコンパイラーに警告させる方法と、特定の未使用の変数についての警告を抑制する方法を確認します。
変数が使用されない理由
未使用の変数がコードベースに残る理由は数多くあります。これらには以下が含まれます:
バグと間違い: 変数が使用されない最も明白な理由は、コードに欠陥があることです。変数は実際にはまったく必要ないので削除してもよいか、変数は必要だが重要なポイントで使用するのを忘れているかのどちらかです。
リファクタリング: ソフトウェアが作成され、書き直されると、コードのセクション全体が削除される場合があります。補助計算の結果など、かつてはコードにとって不可欠であった変数が、未使用のまま残される可能性があります。
将来性: 未使用の変数は、過去のコードのレガシーとしてだけでなく、将来のコードのレガシーとしても発生する可能性があります。まだ書かれていないコードを予期して変数を宣言する場合があります。
条件付きコンパイル: 変数は、プリプロセッサのフェーズによっては未使用のままになる場合があります。標準的な例は、デバッグ目的のみに定義される変数です。コードには次の形式のものが含まれている可能性があります
const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differently(); assert( value == value_for_comparison_only );
-DNDEBUG を指定してコンパイルすると、コンパイラは value_for_comparison_only が決して使用されないことを警告する可能性があります。実際、assert ステートメントは…何も置き換えられていません。
未使用の変数を検出する方法
さまざまなコンパイラと警告レベルの設定は、コンパイル プロセス中に変数が未使用として報告されるかどうかに影響を与える可能性があります。
たとえば、GCC と Clang には、未使用の変数に関する警告をトリガーする -Wunused-variable フラグがあります。このフラグは -Wall 警告オプションによってすでに暗示されており、-Wno-unused-variable によってオフにできます。
私のお勧めは、常に -Wall を指定してコンパイルし、許容される場合は警告を選択的にオフにすることです。これにより、未使用の変数のすべてのインスタンスが削除されます。
未使用の変数を検出しない方法: 属性
常に可能な限り多くの警告を有効にしてコンパイルする必要がありますが、特定の未使用変数に関する警告を選択的にオフにしたい場合もあります。そのための一般的な方法は、 void へのキャストです:
Object unused_object; (void)unused_object;
void へのキャストは変数の (プロフォーマ) 使用としてカウントされるため、警告は発行されません。
これにより、意図したとおり、unused_object が未使用であるという警告が削除されますが、これを改善する方法があります。この void キャストが未使用のオブジェクトを意味するという明示的なセマンティクスが必要です。一般的な方法は、マクロを定義することです:
const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differently(); assert( value == value_for_comparison_only );
利点の 1 つは、この変数の意図 (またはその欠落) を明示的に伝えることができるようになったことです。さらに、未使用の変数のコードをパージすることにした場合、それらの検索がはるかに簡単になります。
マクロを超えて、C 言語のネイティブ、または C/C コンパイラーによって提供される言語拡張としての変数属性があります。たとえば、Clang と GCC では、変数属性 __attribute__((unused)) を使用できます。 C 17 は [[maybe_unused]] 属性をサポートしています:
Object unused_object; (void)unused_object;
これらの属性は、これらの変数が使用されていない可能性があり、それで問題ないことをコンパイラ (そして私たち) に伝えます。
歴史的には、GCC 属性が最初に登場し、C および C のコンパイラ固有の言語拡張でした。 C 17 以降、属性は言語標準の一部です。ただし、スペルが異なるだけでなく、標準拡張と GCC 拡張では属性を配置する場所が一致していません。
[[maybe_unused]] 属性は、条件付きコンパイルを使用してほとんどのアプリケーションを見つけます。たとえば、これはデバッグ専用変数の自然な属性です。純粋に美的理由から、私は個人的にマクロ #define MAYBE_UNUSED [[maybe_unused]] を定義することを好みます。
__attribute__((unused)) の利点は、変数がコード内で使用された場合に実際に警告を発することです。 使用されていない可能性がありますではなく、絶対に使用されていないため、変数を使用すると警告が生成されます。
無駄なものを保管しておく
どうやら、未使用の変数は頻繁に使用されており、独自の言語拡張を保証するほど重要であるようです。
それに比べて、未使用の変数をコメントアウトするのは良い戦略でしょうか?いつもではありません!開発コードとデバッグ段階を通じて未使用の変数を保持しておくのには理由があります。変数が過去のバージョンのコードで使用されていたと仮定すると、古いコードを棚上げするか再統合するかをまだ決めていない可能性があります。意味: 未使用の変数が再び必要になるかどうかはわかりません。
次のようなコードを保持しておくと、デバッグ目的で役立つ場合があります。
#define UNUSED(x) (void)(x); // ... Object unused_object; UNUSED(unused_object);
複雑な計算の結果が決して使用されないとしても、それを保持しておくことは別の障害点を構成します…そしてそれはまさにデバッグ中に望むことです。元々はデバッグを目的としていなかったとしても、プログラムでこの変数を初期化すると、(再度)必要になった場合に役立ちます。
未使用の変数に関するこの投稿がお役に立てば幸いです。
以上がC/C で未使用の変数: その理由と方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、c関数のリターンタイプ、基本(int、float、charなど)、派生(配列、ポインター、構造体)、およびvoid型を含む詳細を示します。 コンパイラは、関数宣言とreturnステートメントを介して返品タイプを決定し、強制します

GULCは、最小限のオーバーヘッド、積極的なインライン、およびコンパイラの最適化を優先する高性能Cライブラリです。 高周波取引や組み込みシステムなどのパフォーマンスクリティカルなアプリケーションに最適な設計では、シンプルさ、モジュールが強調されています

この記事では、文字列ケース変換のC関数について詳しく説明しています。 ctype.hのtoupper()とtolower()を使用し、文字列を介して繰り返し、ヌルターミネーターを処理することを説明しています。 ctype.hを忘れたり、文字列リテラルを変更するなどの一般的な落とし穴は

この記事では、C関数宣言と定義、引数の合格(価値とポインターによる)、返品値、およびメモリリークやタイプの不一致などの一般的な落とし穴について説明します。 モジュール性とProviの宣言の重要性を強調しています

この記事では、C関数の戻り値ストレージを調べます。 通常、リターン値は通常、速度のためにレジスタに保存されます。値が大きいと、ポインターをメモリ(スタックまたはヒープ)に使用し、寿命に影響を与え、手動のメモリ管理が必要になります。直接acc

この記事では、形容詞の「個別」の多面的な使用法を分析し、その文法機能、一般的なフレーズ(例:「はっきりと異なる」とは異なる」、およびフォーマルと非公式の微妙なアプリケーションを調査します。

この記事では、cの効率的なSTLアルゴリズムの使用について詳しく説明しています。 データ構造の選択(ベクトル対リスト)、アルゴリズムの複雑さ分析(STD :: STD :: STD :: PARTIAL_SORTなど)、イテレーターの使用、および並列実行を強調しています。 のような一般的な落とし穴

この記事では、C標準テンプレートライブラリ(STL)について説明し、そのコアコンポーネント(コンテナ、イテレーター、アルゴリズム、およびファンクター)に焦点を当てています。 これらが一般的なプログラミングを有効にし、コード効率を向上させ、読みやすさを改善する方法を詳述しています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

Dreamweaver Mac版
ビジュアル Web 開発ツール

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。
