为什么Visual Studio运行时库源代码存储在两个目录中?

mez*_*hic 8 windows visual-studio visual-c++ visual-studio-2013

似乎有两个路径包含Microsoft Visual Studio运行时源文件:

C:\ Program Files(x86)\ Microsoft Visual Studio 12.0\VC\crt\src

C:\ Program Files(x86)\ Microsoft Visual Studio 12.0\VC\include

某些文件出现在两个目录中,但大小不同.我特别查看了一个文件,它在两个文件中都定义了相同的方法.

所以我的问题是,这两条路径的使用有什么不同?我想知道我在Visual Studio中调试时(我不是指调试模式),哪个文件是屏幕上的代码?

Jam*_*lis 11

include目录包含所有公共标头.这是头,你可以包括在你的代码,就像<stdio.h><type_traits>那些header要求,再加上实现的头.

crt\src目录包含了CRT的来源,包括大多数的.asm,.c以及.cpp使用的文件建立CRT.此目录还包含许多CRT标头的副本,在某些情况下,这些标头与include目录中的标头不同.这纯粹是CRT如何构建的工件.

调试CRT标头中定义的内联代码时,调试器应始终选择正确的标头.如果两个目录都包含相同的标题副本,那么调试器只会选择一个,因为标题是相同的,所以它选择哪一个并不重要.如果标题不同,那么调试器选择哪个标头取决于编译内联函数的对象.如果对象是CRT的一部分,你将进入标题crt\src; 如果对象来自您的一个源文件,您将进入标题include.基本上,调试器应始终能够找到标头的正确副本.

我们在Visual Studio"14"CTP中大大简化了这一点.crt\src目录中不再有任何公共标头,目录中提供的标头include与用于构建CRT 的标头相同.


小智 3

CRT 位于 Visual C++ 库堆栈的底部:其余库都依赖于它,并且几乎所有本机模块也都依赖于它。它包含两种内容:(1) C 标准库和各种扩展,以及 (2) 进程启动和异常处理等所需的运行时功能。由于 CRT 位于堆栈的底部,因此它是开始稳定库过程的逻辑位置。


来自James McNellis 的《伟大的 C 运行时 (CRT) 重构》:

(1) 我们通过 Visual Studio 提供大部分 CRT 源代码;您可以在 Visual Studio 安装目录下的VC\crt\src.

(2) 在 Visual Studio 2013 中,我们随产品附带的源代码中有 6,830 个#if#ifdef#ifndef#elif和指令;#else在 Visual Studio“14”CTP 中有 1,656 个。这些数字不包括标头中的指令,但它们确实包括 STL 源文件,这些文件基本上没有受到此重构工作的影响,因此这不是一个完美的衡量标准,但它表明了已完成的清理量。

  • @FrédéricHamidi 不。詹姆斯·麦克内利斯没有乔装打扮。:-) (4认同)
  • 我怀疑您是伪装的 James McNellis,因此您应该提供*正确的归属*(至少,他的名字和[原始文章]的链接(http://blogs.msdn.com/b/vcblog/archive /2014/06/10/the-great-crt-refactoring.aspx)你引用)。我也不明白这如何回答这个问题。 (3认同)