VC++“Generating Code”是什么意思?

20

在Visual Studio中进行编译时,编译器似乎会自行输出以下内容:

1>正在生成代码...

这里的“Generating Code”具体是指什么呢?

4个回答

17

它正在执行其所说的操作:生成机器码。许多编译器将C/C++源代码翻译成一些中间内部表示形式,稍后用作生成实际机器码的源代码。Visual C++编译器(像许多其他编译器一样)以批处理方式执行此操作:首先将一堆源文件翻译成该中间表示形式,然后将它们全部转换为机器码(然后开始处理下一批)。这就是当您看到“正在生成代码”消息时发生的情况。

我不知道它用于将源文件拆分成批次的确切逻辑。也许它仅按大小工作:一旦迄今为止生成的所有中间表示形式的总大小达到某个限制,它就会切换到“生成代码”模式。也许还有其他逻辑在那里起作用。

无论如何,请注意,在这种情况下,未经资格认证的术语“代码”并不是指源代码,这意味着它与模板和/或预处理器等没有任何关系。此外,将C源代码称为未经资格认证的“代码”(而不是合格的“源代码”)是一件非常小众的事情,更适合于营销部门而不是实际程序员。在程序员层面上,没有人将C源代码简称为“代码” :)


很好的区分,我开始想知道为什么在我正在开发的新解决方案中会出现这么多代码生成,我错误地认为是源代码生成。 - jxramos

4
编译器一次性读取多个输入文件,解析其中几个文件,并在此之后为它们生成输出文件(目标文件),然后再读取更多的输入文件。我猜这是一种优化措施,可能是因为对磁盘进行混合读写访问比将其分成(首先)读取访问和(然后)写入访问要慢。

我猜想,无论谁给这个点了踩,都比我更懂。能否给我解释一下? - sbi

-2

Visual Studio正在调用链接器LINK.exe,它主要使用目标文件作为输入,生成可执行文件作为输出,但也能够处理与这些文件相关的其他工作。MSDN上的链接器命令行语法


1
在这种情况下,我不这么认为,meds指的是源代码的编译,而不是链接时间。尽管你说得对,链接器也可以生成用于实例化模板的代码。 - Steve Folly

-2

模板实例(以及其他类型的代码)可能会生成代码(在某些情况下可能不会)。


2
是的,但即使代码中没有模板,VC在这个阶段也需要花费一些时间。 - sbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接