Каковы соглашения для заголовков и файлов cpp в C ++? - PullRequest
3 голосов
/ 12 февраля 2009

В C ++, что является соглашением для включения заголовков для файлов классов в «основной» файл. например,

myclass.h 

class MyClass {
  doSomething();
}


myclass.cpp

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


run.cpp

#include "myclass.h"
#include "myclass.cpp"

etc..

Это относительно стандартно?

Ответы [ 6 ]

3 голосов
/ 12 февраля 2009

Вы не включаете файл .cpp, только файл .h. Определения функций в .cpp будут скомпилированы в файлы .obj, которые затем будут связаны в окончательный двоичный файл. Если вы включите файл .cpp в другие файлы .cpp, вы получите два разных файла .obj с одинаковым скомпилированным определением функции, что приведет к ошибке компоновщика.

1 голос
/ 12 февраля 2009

Можно сказать, что один файл .cpp и все включенные в него заголовки составляют одну единицу перевода. Как видно из названия, одна единица перевода компилируется самостоятельно. Результат, часто называемый file.o или file.obj для каждого модуля перевода, затем связывается вместе компоновщиком, исправляя еще не разрешенные ссылки. Так что в вашем случае у вас есть

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

Ваше определение класса будет отображаться в обеих единицах перевода. Но это нормально. Это разрешено, если оба класса одинаково определены. Но нельзя использовать одну и ту же функцию в двух единицах перевода, если она не встроенная. Не встроенные функции могут быть определены только один раз, в одной единице перевода. Затем компоновщик берет результат каждого модуля перевода и связывает их вместе с исполняемым файлом:

Executable = mystuff: run.o myclass.o ...
1 голос
/ 12 февраля 2009

См. Понимание компиляторов C , где можно найти много хороших ответов на этот вопрос.

0 голосов
/ 12 февраля 2009

Вы не включаете один * .cpp в другой * .cpp. Вместо этого:


myclass.h

class MyClass {
  doSomething();
}

myclass.cpp

#include "myclass.h"

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

run.cpp

#include "myclass.h"

etc..

Вместо того, чтобы включать myclass.cpp в main.cpp (так, чтобы компилятор видел их обоих за один проход), вы компилируете myclass.cpp и main.cpp отдельно, а затем позволяете «компоновщику» объединять их в один исполняемый файл.

0 голосов
/ 12 февраля 2009

Вы компилируете файлы cpp отдельно. Если вы включите какой-либо данный файл cpp в два или более файлов cpp, yoy может столкнуться с конфликтом на этапе компоновки.

0 голосов
/ 12 февраля 2009

обычно вы компилируете файл .cpp отдельно и связываете полученный .o с другими .o

Таким образом, myclass.cpp будет включать myclass.h и будет скомпилирован как единое целое.

...