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

标签 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 位版本编译时出现以下错误:

fatal error C1063:编译器限制:编译器堆栈溢出

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

最佳答案

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

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

例如:
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

源文件允许您编译数据一次,然后仅在内容发生更改时进行编译。

当您将数据放入 header 时,包含 header 的每个文件都会获取数据并编译 header 。如果我对这些源文件之一进行更改,书籍数据将再次编译,因为它位于头文件中。

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

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

可以在数据库中吗?

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

分成章节允许您创建指向章节的指针数组。这将有助于更轻松地建立索引和推进。如果您需要前进到第 9 章,只需转到索引中的插槽 9 并拉出指针即可。 :-)

生成数据文件

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

关于c++ - 编译单个大头文件(VS : C1063),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26981436/

相关文章:

c++ - MingW 中的多线程 Windows 服务

c - 什么是事件句柄?

python - 为什么 Python 在返回 C 字符串时会崩溃?

c# - 如何将 MVC 5 项目模板添加到 VS 2012?

c# - MSTest 中是否有非静态 ClassInitialize 替代方案?

c++ - 由于私有(private)继承而无法访问的类型

c++ - 单行类声明和实例化

C99 相当于 MATLAB "filter"?

VB.NET 奇怪的输出消息 "Uninit : Still Alive 1"

Android NDK 包含 Eigen