TGViewer
C/C++ | Вопросы собесов C/C++ | Вопросы собесов @easy_c_plus · 4.19K subscribers
Post #2191 848
🤔 Что такое ODR?

ODR (One Definition Rule) – это правило одной определения в C++, которое запрещает множественное определение одной и той же сущности в программе.
ODR применяется к:
Переменным
Функциям
Классам
Если ODR нарушено, получим ошибку компоновки (linker error, multiple definition).

🚩Основные правила ODR

Переменная может быть определена только один раз
// a.cpp
int x = 42; // Определение переменной

// b.cpp
int x = 42; // ❌ Ошибка компоновки: повторное определение x


Решение: Использовать extern в заголовочном файле.
// common.h
extern int x; // Объявление

// a.cpp
#include "common.h"
int x = 42; // Определение (только в одном месте)

// b.cpp
#include "common.h"


Функция может быть определена только один раз (если не inline)
// a.cpp
void foo() { } // Определение функции

// b.cpp
void foo() { } // ❌ Ошибка: повторное определение


Решение: Использовать inline или объявить в header, но определить в .cpp.
// common.h
inline void foo() { } // ✅ OK, `inline` разрешает множественные определения


Класс можно определить только один раз
// a.h
struct A {
int x;
};

// a.h включён в два файла -> ❌ Ошибка "redefinition of struct A"


Решение: Использовать #pragma once или #ifndef
// a.h
#pragma once // ✅ Защита от двойного включения
struct A {
int x;
};


constexpr нарушает ODR при разных значениях
// common.h
constexpr int getValue() { return 10; }

// a.cpp
int a = getValue(); // 10

// b.cpp
constexpr int getValue() { return 20; } // ❌ Ошибка: разные определения


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
  • 💊 1
More from @easy_c_plus
  1. Oct 13, 2026🤔 Расскажите про ключевое слово _fastcall? Это соглашение о вызове функций, используемое…
  2. Oct 13, 2026Post #2566
  3. Oct 12, 2026🤔 Какие есть уровни exception гарантий? 1. No-throw Guarantee: метод или операция не выбр…
  4. Oct 12, 2026🤔 Какая сложность поиска в set и unordered_set? Контейнеры set и unordered_set представля…
  5. Oct 11, 2026Post #2563
  6. Oct 11, 2026🤔 Как проверять равенство двух float? Равенство двух float проверяется с учётом допустимо…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →