Я пытаюсь получить преимущества разделения без двух файлов. Сплит-компиляция без разделения хранилища.
Я понимаю преимущества разделения файлов .h и .cpp, но мне очень не нравится, когда файлы разделяются, особенно когда классы крошечные и каждый файл может поместиться на одной странице.
Есть ли опция прекомпилятора или какой-то другой трюк, который позволил бы мне сохранить преимущества разделения, сохраняя текст в одном месте? Например:
РЕДАКТИРОВАТЬ: пожалуйста, не фокусируйтесь слишком много на этом примере. Он должен был показать воображаемый аргумент препроцессора #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
Я не уверен, что это стоит затраченных усилий, но вы можете поместить содержимое вашего файла .cpp в #ifdef
разделы, как это:
#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
Вы можете просто поместить реализацию прямо в заголовок следующим образом:
// 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; }
Другим потенциальным решением этой проблемы является предлагаемый стандарт модулей С ++. Если вам случится так много лет спустя, посмотрите туда.