编译单个大头文件(VS:C1063)

时间:2014-11-17 20:32:16

标签: c++ c visual-studio-2012 header-files

我正在尝试将一本书编成我的可执行文件。

这本书必须编译成我的可执行文件。我无法读取文件或其他数据库管理系统。

目前,我将本书的文本放在单个头文件中,该文件具有返回文本字符串的函数。

问题是这个头文件长47,000+行,4MB +大。

我尝试在main.cpp文件中测试此文件,如下所示:

#include "MyBook.h"

int main(int argc, char** argv)
{
     auto myBookStr = MyBook_ToString();
     loadMyBook(myBookStr);
}

使用VS2012 64位版本编译时出现以下错误:

致命错误C1063:编译器限制:编译器堆栈溢出

解决此问题的最佳方法是什么?在我的脑海中,我唯一能想到的就是将标题拆分为多个文件,并在每个文件中返回一个字符串。是否有更优雅的解决方案来编译大型头文件?

2 个答案:

答案 0 :(得分:4)

当人们将数据放入头文件时,我真的很讨厌。

如果必须将数据编译到可执行文件中,请将所有数据移动到源文件中。

例如:
book.cpp:

const char Book1_text[] = 
"Four score and seventy years ago"
" our forefathers came to this island"
" to consume our every byte of data"
//...
" and thus ends my book."  

<强> book.hpp:

#ifndef BOOK_HPP
#define BOOK_HPP
extern const char Book1_text[];
#endif // BOOK_HPP

源文件允许您只在内容发生变化时编辑一次然后编译数据。

将数据放入标题时,包含标题的每个文件都会获取数据并编译标题。如果我对其中一个源文件进行了更改,则书籍数据会再次编译,因为它位于头文件中。

您真的需要在您的可执行文件中包含数据吗?

可以在程序之外的文本文件中吗?

它可以在数据库中吗?

编辑1:
您可以将本书拆分为章节,并将每章作为单独的数据语句,或者甚至作为单独的文件中的单独数据语句。

分解为章节允许您创建指向章节的指针数组。这将有助于索引和推进更容易。如果你需要进入第9章,只需转到索引中的插槽9并拔出指针。 : - )

生成数据文件

在许多商店中,他们不是手工输入所有数据语句,而是创建一个小型应用程序,它接受一个源(如文本文件)并将其转换为C语句。这样可以更容易地更新原始文本文件(一次),然后简单地生成数据语句。否则,文本编辑的传播变得笨拙。

答案 1 :(得分:0)

我意识到这已经是4年了。我最终采用的解决方案是增加文件的宽度并缩短文件的长度。

示例: MyBook最初是大约5万行文本,我试图在一个cpp文件中进行编译。通过增加字符串宽度,我可以将此长度减少到仅250行代码。 MSVC和GCC / Clang对单行有字符限制。通过每行最多写入16000个字符宽度的文本,我能够减少文件长度。一旦这样做,文件就会很快编译,并且不会遇到编译器堆栈溢出的情况。