ホームページ >バックエンド開発 >C++ >C での ODR の使用とは何ですか?また定義が必要になるのはどのような場合ですか?

C での ODR の使用とは何ですか?また定義が必要になるのはどのような場合ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-06 12:05:15703ブラウズ

What is ODR-Use in C   and When is a Definition Required?

C の "odr-use" を理解する

C では、「1 つの定義ルール」(ODR) の概念により、それぞれの複数のコンパイル単位で宣言されたエンティティの場合、定義は 1 つだけ存在します。ただし、いつ定義が必要かを判断するのは混乱を招く可能性があります。 「odr-use」という用語は、この文脈で登場します。

C 標準によれば、変数または関数は次のように odr-use されます。

  • その名前が潜在的に評価される式であり、定数式の評価に適したオブジェクトではありません。
  • オーバーロードされていない関数の場合、その名前が潜在的に評価される式、またはオーバーロード解決によって選択された一連の候補関数内。

この定義は少し抽象的であるため、単純化してみましょう。 Odr-use は本質的に、プログラム内のどこかで定義する必要がある方法でエンティティが使用されることを意味します。これには、関数の呼び出しや変数へのアクセスなどの実際の使用法と、オーバーロード解決の候補となるなどの潜在的な使用法が含まれます。

クラス テンプレートのメンバー関数の場合、それらはインスタンス化されるだけです (したがって、定義されています)それらがODRで使用されている場合。これは、それらを呼び出す必要があるか、そのメンバー関数を仮想にしてクラス自体をインスタンス化する必要があることを意味します。

標準は、この原則に基づいて不必要なインスタンス化を防止します。たとえば、 std::list::sort 関数には、operator< が必要です。その要素について。演算子<をサポートしない要素タイプでリストを宣言すると、sort が呼び出されない限り、メンバー関数はインスタンス化されません。

欠落に関連するエラーを回避するには、odr-use を理解することが重要です。定義、および複数のコンパイル単位での複数の定義。これらのルールに従うことで、プログラマは堅牢で保守可能な C コードを作成できます。

以上がC での ODR の使用とは何ですか?また定義が必要になるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。