Question

Considérez les fichiers source suivants 1.cpp

#include <iostream>

using namespace std;

struct X
{
    X()
    {
        cout << "1" << endl;
    }
};

void bar();

void foo()
{
    X x;
}

int main()
{
    foo();
    bar();
    return 0;
}

2.CPP

#include <cstdio>

struct X
{
    X()
    {
        printf("2\n");
    }
};

void bar()
{
    X x;
}

Le programme est-il compilé à partir de ces fichiers bien formés? Qu'est-ce qui devrait être dans sa sortie?

Je m'attendais à l'erreur de liaison en raison de la violation d'une règle de définition ou d'une sortie "1 2". Cependant, il imprime "1 1" lorsqu'il est compilé avec G ++ 3.4 et VC 8.0.
Comment cela peut être expliqué?

Était-ce utile?

La solution

Cela viole l'ODR (3.2) - spécifiquement que vous pouvez avoir plus d'une définition d'une fonction en ligne, mais ces définitions doivent être identiques (3.2 / 5) - et conduit à un comportement indéfini, donc tout peut se produire et le compilateur / l'éditeur de liaison est pas obligé de diagnostiquer cela. La raison la plus probable pour laquelle vous voyez que le comportement est que les appels de fonction sont inclus et ne participent pas à la liaison, donc aucune erreur de liaison n'est émise.

Autres conseils

C'est un comportement non défini (sans diagnostic requis) si les fonctions inclinées (comme votre constructeur de classe) ont différent Définitions dans différentes unités de traduction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top