2

我正在开发一个生成大量 C 代码的 C# 程序。它生成一个 .c 文件和随附的头文件。在一个非常基本的层面上,程序从用户那里接受一个字符串,然后将它与在 autogen 期间放置在头文件中的数千个其他字符串进行比较。

头文件包含超过 800k 行代码,.c 文件包含大约 300k。可以想象,这些都是非常大的文件。现在,我意识到拥有这么大的文件是不好的编码习惯。最好的办法是将这个文件分解成更小的文件并以这种方式编译它,但是我们可以假设这两个文件结构对于我的项目将如何在总体方案中使用是必要的。

考虑到这一点,我在 Visual Studio IDE 和命令行中编译该程序时遇到了问题。事实上,这并不完全正确。每次我用任何一种方法尝试它时,它似乎都可以编译(诚然,这需要一段时间)。但是,当我开始运行程序时,问题就出现了。它很好地到达了输入循环,但是在接受用户输入后,程序崩溃并出现以下错误:

“Prototype.exe 中 0x008105f9 处未处理的异常:0xC0000005:访问冲突写入位置 0x00000000。”

我相当确定这不是我的代码导致问题。我已经运行了在调试模式下生成的代码的一个版本,它要小得多并且运行良好。唯一的区别是由 C# 程序写入头文件的字符串的数量。较小文件的大小分别为 14k 和 5k 行。此外,IDE 不允许我在使用完整大小的代码编译和运行后使用断点进行调试,而我的较小代码可以。

我的问题是:C 语言或 Visual Studio 编译器对单个大文件是否有任何限制或问题会导致上述错误?如果是这样,有没有办法在保留我的两文件结构的同时规避这个限制?我尝试在属性对话框中将堆和堆栈大小增加到 4mb,但这没有帮助。

我意识到这是一种生成和运行代码的异常方式,但我会很感激任何建议。

4

1 回答 1

3

我意识到拥有这么大的文件是不好的编码习惯

不它不是。

拥有一个像这样手动维护的 LOGIC 文件是不好的做法。

拥有一个庞大的常量文件是有争议的,

但是像这样生成的文件不会出现在编码实践中,因为你不编码。你生成它。

生成代码的文件很少有好处,例如易于生成。VS.ENT 自己做这件事 - EntityFramework 等生成一个包含大量类的 cs 文件,所有这些都来自一个输入模型。

C 语言或 Visual Studio 编译器对单个 arge 文件是否有任何限制或问题会导致上述错误?

没有任何记录。您可能会遇到很少有人见过的错误。我担心您需要重写或 - PSS 支持案例(Microsoft 支持服务),如果您发现编译器错误,它可能是免费的。

或者,它可能是您的代码 - 如果您的调试案例要小得多,则可能是您的代码对完整数据集产生错误,这比编译器问题更有可能。

我建议您使用 FULL 文件而不是一小部分文件进行调试运行。调试器可能会将您指向一个令人惊讶的位置。

于 2012-07-06T10:42:18.987 回答