2010-11-10 34 views
7

Selon une règle de définition (ODR) Je ne peux pas avoir une fonctionComment se présente une situation où différentes implémentations d'une fonction inline sont liées dans un exécutable classé?

void function() 
{ 
} 

défini plus d'une fois dans un exécutable - éditeur de liens objet. Cependant ODR est ignoré pour les fonctions en ligne:

inline void function() 
{ 
} 

peut être défini dans un fichier d'en-tête qui sera #include dans plusieurs fichiers Cpp et donc quand les fichiers résultants sont reliés entre eux l'éditeur de liens voit qu'il y sommes plusieurs instances de cette fonction et ignore intentionnellement cela. Il suppose que c'est la même fonction et utilise simplement l'une des instances. Puisque le comportement du programme est préservé, personne ne s'en soucie. Mais si pour une raison quelconque, use of preprocessor included, ces instances ont des implémentations différentes, l'éditeur de liens choisira à nouveau l'une des fonctions et le développeur ne saura même pas lequel est choisi jusqu'à ce qu'il teste son programme.

Comment cette dernière situation se présente-t-elle lorsque le lieur choisit l'une des fonctions et qu'il a des classifications différentes? Est-ce un comportement indéfini ou tout autre type de situation?

+1

La réponse courte: Broken. – BCS

Répondre

6

Oui, c'est UB pour les fonctions en ligne avec liaison externe (je pense que c'est ce que l'OP a l'intention).

3,2/5-

$

Il peut y avoir plus d'une définition d'un type de classe (article 9), type d'énumération (7.2), la fonction en ligne avec lien externe (7.1.2) , modèle de classe (clause 14), modèle de fonction non statique (14.5.5), membre statique d'un modèle de classe (14.5.1.3), membre de la classe modèle (14.5.1.1), ou modèle spécialisation pour laquelle certains paramètres du modèle ne sont pas t spécifié (14.7, 14.5.4) dans un programme à condition que chaque définition apparaisse dans une unité de traduction différente, et à condition que les définitions satisfassent aux exigences suivantes.

Compte tenu d'une telle entité nommée D définie dans plus d'une unité de traduction, puis

- chaque définition de D sont consister en la même séquence de jetons; et

Le même paragraphe à la fin indique que le non respect de ces exigences conduit à UB

+0

S'il vous plaît ne pas utiliser le mot «para», cela signifie quelque chose de complètement différent du paragraphe. –

+0

@Matt Joiner: l'ai changé. S'excuser si cela signifie quelque chose d'indésirable. – Chubsdad