препроцессор — возможно ли отдельно компилировать код класса в c ++ (например, .h и .cpp), используя только один файл?

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

Я понимаю преимущества разделения файлов .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

-3

Решение

Я не уверен, что это стоит затраченных усилий, но вы можете поместить содержимое вашего файла .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
1

Другие решения

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

// 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; }
0

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector