Можно ли отдельно скомпилировать код класса в c ++ (например, .h и .cpp), используя только один файл? - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь получить преимущества разделения без двух файлов.Сплит-компиляция без разделения хранилища.

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

Есть ли опция прекомпилятора или какой-либо другой трюк, который позволил бы мне сохранить преимущества разделения, сохраняя текст в одном месте? Например:

РЕДАКТИРОВАТЬ: пожалуйста, не слишком сосредотачивайтесь на этом примере.Он должен был показать воображаемый препроцессор arg #CPP_SPLIT.Фактический код не важен, пожалуйста, игнорируйте его.

// TinyClass.h
class TinyClass {
  TinyClass();
  int answerToLife();
}

// the following is a fake compiler arg
// in this example it would be totally unnecessary, 
// but many of my classes have some form of circular referencing
// and can not include all the code in the .h file
#CPP_SPLIT

TinyClass::TinyClass() {}
TinyClass::answerToLife() { return 42; }

#CPP_SPLIT_END

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Я не уверен, что это стоит затраченных усилий, но вы можете поместить содержимое вашего файла .cpp в #ifdef 'd разделы, например:

#ifdef PART_ONE

[...]

#endif

#ifdef PART_TWO

[...]

#endif

#ifdef PART_THREE

[...]

#endif

... и затем перекомпилироватьфайл за несколько проходов, например:

g++ -DPART_ONE   -opart1.o myfile.cpp
g++ -DPART_TWO   -opart2.o myfile.cpp
g++ -DPART_THREE -opart3.o myfile.cpp
g++ -o a.out part1.o part2.o part3.o
0 голосов
/ 16 декабря 2018

Другим потенциальным решением этой проблемы является предлагаемый стандарт модулей c ++.Если вам случится так много лет спустя, посмотрите туда.

0 голосов
/ 15 декабря 2018

Вы можете просто поместить реализацию прямо в заголовок следующим образом:

// TinyClass.h
class TinyClass {
  TinyClass() {}
  int answerToLife() { return 42; }
};

Также inline может помочь сделать то, что вы хотите:

// TinyClass.h
class TinyClass {
  TinyClass();
  int answerToLife();
}

inline TinyClass::TinyClass() {}
inline int TinyClass::answerToLife() { return 42; }
...