是否可以仅使用一个文件来单独编译c ++中的类代码(如.h和.cpp)?

时间:2018-12-15 20:37:03

标签: c++ preprocessor code-splitting

我正尝试获得不使用两个文件进行拆分的好处。在不拆分存储的情况下拆分编译。

我了解分离.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 :(得分:1)

我不确定是否值得为此付出努力,但是您可以将.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 :(得分:0)

您可以像下面这样直接将实现直接放在标头中:

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

答案 2 :(得分:0)

另一种可能的解决方案似乎是提议的c ++模块标准。如果您沿线走过这么多年,请看看那里。