ODR One Definition Rule, règle de la définition unique
La règle selon laquelle chaque entité ne peut être définie qu'une seule fois dans un programme, et tout ce qui peut l'être plusieurs fois doit l'être de façon identique partout.
Une classe ou une fonction inline peut apparaître dans plusieurs unités de compilation, mais toutes les définitions doivent se composer des mêmes lexèmes et signifier la même chose. Le hic tient à la formulation de la norme : les violations sont « mal formées, aucun diagnostic requis ». Le compilateur ne voit qu'un fichier à la fois, l'éditeur de liens que des noms décorés ; quand deux fichiers définissent la même classe différemment — typiquement parce qu'un #define ou un pragma d'alignement différait entre deux bibliothèques — l'éditeur de liens en retient une en silence et jette l'autre. Résultat : un programme qui fonctionne jusqu'au jour où quelqu'un change l'ordre de liaison. Des outils existent : ASan embarque une vérification, tout comme lld et gold.