読者です 読者をやめる 読者になる 読者になる

【C++】One definition ruleってなに?

One definition rule(ODR)の基本概念

あらゆる変数、関数、クラス型、enum型、テンプレートについて基本的に複数の定義を持つことはできないというルール
このことは、ISO C++ Standard(ISO/IEC 14882) section3.2に記してある。

In any translation unit, a template, type, function, or object can have no more than one definition. Some of these can have any number of declarations. A definition provides an instance.

In the entire program, an object or non-inline function cannot have more than one definition; if an object or function is used, it must have exactly one definition. You can declare an object or function that is never used, in which case you don't have to provide a definition. In no event can there be more than one definition.

Some things, like types, templates, and extern inline functions, can be defined in more than one translation unit. For a given entity, each definition must be the same. Non-extern objects and functions in different translation units are different entities, even if their names and types are the same.

ODRを違反するとコンパイラに指摘される。

違反例

class C {}; // first definition of C
class C {}; // error, second definition of C

このような例は、ヘッダーファイルを二度呼んでしまった場合に起こる。
だからヘッダーガードをつけよう。