可以在 Visual Studio C 中编译的文件大小是不是有限制?

Posted

技术标签:

【中文标题】可以在 Visual Studio C 中编译的文件大小是不是有限制?【英文标题】:Are there limits on the size of file that can be compiled in Visual Studio C?可以在 Visual Studio C 中编译的文件大小是否有限制? 【发布时间】:2012-07-06 10:32:56 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

不,不是。

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

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

但生成的文件不会出现在编码实践中,因为您不会对其进行编码。你生成它。

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

C 语言或 Visual Studio 编译器是否存在单参数限制或问题 会导致上述错误的文件?

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

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

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

【讨论】:

“我建议你使用完整的文件进行调试,而不是一小部分” - 如果这没有帮助,我会尝试的另一件事是动态分配相同的数据结构,通过读取包含与您的 autogen 内容相同的字符串的纯文本文件。然后在动态分配的结构上运行您的代码。如果它适用于这个但不适用于doom的头文件,这表明它是编译器无法处理这种大小的数据,而不是你的代码。 感谢您的建议。我将实施它们并报告。 在测试了你的建议后,我发现我找错了树。我没有为我的一个结构分配足够的内存,并且程序填满它的速度太快了。我现在已经解决了这个问题。感谢您的帮助。 ;) 说错了树。规则一 - 编译器是正确的。规则二 - 规则一有时可能是错误的。 20 年的编程生涯,我见过 ONCE(重命名(!)一个变量修复了这个很有趣)。一般来说,可以安全地假设这不是编译器问题;)

以上是关于可以在 Visual Studio C 中编译的文件大小是不是有限制?的主要内容,如果未能解决你的问题,请参考以下文章

如何在visual studio2008中创建,编译和运行C++程序,

可以在 Visual Studio C 中编译的文件大小是不是有限制?

如何用visual studio2010编译已经写好的C#的源代码

.LIB 和 .OBJ 文件有啥区别? (Visual Studio C++)

Visual Studio 2013 编译严格的 c++11

在 Visual Studio 2013 中使用 Roslyn 编译器