2009-02-12 8 views

Répondre

3

Vous n'incluez pas le fichier .cpp, uniquement le fichier .h. Les définitions de fonction dans le .cpp seront compilées en fichiers .obj, qui seront ensuite liés au binaire final. Si vous incluez le fichier .cpp dans d'autres fichiers .cpp, vous obtiendrez deux fichiers .obj différents avec la même définition de funciton compilée, ce qui entraînera une erreur de l'éditeur de liens.

1

Voir Understanding C Compilers pour beaucoup de bonnes réponses à cette question.

+0

Je suis d'accord médecin! ci-dessus aussi: http: // stackoverflow.com/questions/533076/understanding-c-compilers-from-a-java-c-perspective/533201 # 533201 – bobby

0

habituellement vous compilez le fichier .cpp séparément et lier le .o résultant avec d'autres

de .o

Alors MyClass.cpp comprendrait la MyClass.h et seront compilées comme une unité.

0

Vous compilez les fichiers cpp séparément. Si vous incluez un fichier cpp donné dans deux ou plusieurs fichiers cpp, vous risquez de rencontrer un conflit pendant la phase de liaison.

0

Vous n'incluez pas * .cpp dans un autre * .cpp. Au lieu de cela:


MyClass.h

class MyClass { 
    doSomething(); 
} 

MyClass.cpp

#include "myclass.h" 

MyClass::doSomething() { 
     cout << "doing something"; 
} 

run.cpp

#include "myclass.h" 

etc.. 

Au lieu d'inclure MyClass.cpp l'intérieur main.cpp (tel que le compilateur verrait tous les deux en un seul passage), vous compilez MyClass.cpp et main.cpp séparément , puis laissez le 'linker' les combiner en un seul exécutable.

1

Vous pouvez dire un fichier .cpp et tous ses en-têtes inclus constituent une unité de traduction. Comme son nom l'indique, une unité de traduction est compilée seule. Le résultat, souvent appelé fichier.o ou fichier.obj, de chaque unité de traduction, est ensuite lié par l'éditeur de liens, en corrigeant des références non résolues. Donc dans votre cas, vous avez

Translation Unit 1 = run.cpp: myclass.h ... 
Translation Unit 2 = myclass.cpp: myclass.h ... 

Votre définition de classe apparaîtra dans les deux unités de traduction. Mais ça va. C'est permis, tant que les deux classes sont également définies. Mais il n'est pas permis d'avoir la même fonction dans les deux unités de traduction si la fonction n'est pas en ligne. Les fonctions non intégrées ne peuvent être définies qu'une seule fois, dans une seule unité de traduction. Ensuite, vous avez l'éditeur de liens prendre le résultat de chaque unité de traduction, et les lier ensemble à un exécutable:

Executable = mystuff: run.o myclass.o ... 
+0

Je peux me tromper mais je pense que la classe est * déclarée * dans les deux unités et * définie * en une seule : le fichier * .h contient la * déclaration * de la classe et le * .cpp contient la * définition *. – ChrisW

+0

non, il contient la définition. ce que contient le fichier cpp est la définition des fonctions membres/membres statiques. mais la définition de classe est placée dans l'en-tête (une classe * declaration * est juste "class foo;" alors qu'une * definition * pourrait être "class foo {};") –

Questions connexes