<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=Visual_C%2B%2B_Runtime</id>
	<title>Visual C++ Runtime - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=Visual_C%2B%2B_Runtime"/>
	<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Visual_C%2B%2B_Runtime&amp;action=history"/>
	<updated>2026-04-07T12:12:11Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=Visual_C%2B%2B_Runtime&amp;diff=1096&amp;oldid=prev</id>
		<title>Zhang3：创建页面，内容为“由于不能将标准C++运行时链接到内核，所以需要几个函数来替换它的功能。 本文提供有关如何为Visual C++编译器实现你自己的C++运行库的信息。   == 调用全局静态变量的构造函数 == 这段代码将有助于调用全局静态变量的所有构造函数。  &lt;source lang=&quot;c&quot;&gt;// 构造函数原型 typedef void (__cdecl *_PVFV)(void); typedef int  (__cdecl *_PIFV)(void);  // 链接器将构造函数放在这些…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Visual_C%2B%2B_Runtime&amp;diff=1096&amp;oldid=prev"/>
		<updated>2022-03-31T08:59:17Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“由于不能将标准C++运行时链接到内核，所以需要几个函数来替换它的功能。 本文提供有关如何为Visual C++编译器实现你自己的C++运行库的信息。   == 调用全局静态变量的构造函数 == 这段代码将有助于调用全局静态变量的所有构造函数。  &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;// 构造函数原型 typedef void (__cdecl *_PVFV)(void); typedef int  (__cdecl *_PIFV)(void);  // 链接器将构造函数放在这些…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;由于不能将标准C++运行时链接到内核，所以需要几个函数来替换它的功能。 本文提供有关如何为Visual C++编译器实现你自己的C++运行库的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 调用全局静态变量的构造函数 ==&lt;br /&gt;
这段代码将有助于调用全局静态变量的所有构造函数。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;// 构造函数原型&lt;br /&gt;
typedef void (__cdecl *_PVFV)(void);&lt;br /&gt;
typedef int  (__cdecl *_PIFV)(void);&lt;br /&gt;
&lt;br /&gt;
// 链接器将构造函数放在这些部分之间，我们使用它们来定位构造函数指针。&lt;br /&gt;
#pragma section(&amp;quot;.CRT$XIA&amp;quot;,long,read)&lt;br /&gt;
#pragma section(&amp;quot;.CRT$XIZ&amp;quot;,long,read)&lt;br /&gt;
#pragma section(&amp;quot;.CRT$XCA&amp;quot;,long,read)&lt;br /&gt;
#pragma section(&amp;quot;.CRT$XCZ&amp;quot;,long,read)&lt;br /&gt;
&lt;br /&gt;
//将.CRT数据放入.rdata节&lt;br /&gt;
#pragma comment(linker, &amp;quot;/merge:.CRT=.rdata&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
// 围绕构造函数的指针&lt;br /&gt;
__declspec(allocate(&amp;quot;.CRT$XIA&amp;quot;)) _PIFV __xi_a[] = { 0 };&lt;br /&gt;
__declspec(allocate(&amp;quot;.CRT$XIZ&amp;quot;)) _PIFV __xi_z[] = { 0 };&lt;br /&gt;
__declspec(allocate(&amp;quot;.CRT$XCA&amp;quot;)) _PVFV __xc_a[] = { 0 };&lt;br /&gt;
__declspec(allocate(&amp;quot;.CRT$XCZ&amp;quot;)) _PVFV __xc_z[] = { 0 };&lt;br /&gt;
&lt;br /&gt;
extern __declspec(allocate(&amp;quot;.CRT$XIA&amp;quot;)) _PIFV __xi_a[];&lt;br /&gt;
extern __declspec(allocate(&amp;quot;.CRT$XIZ&amp;quot;)) _PIFV __xi_z[];    // C初始化器&lt;br /&gt;
extern __declspec(allocate(&amp;quot;.CRT$XCA&amp;quot;)) _PVFV __xc_a[];&lt;br /&gt;
extern __declspec(allocate(&amp;quot;.CRT$XCZ&amp;quot;)) _PVFV __xc_z[];    // C++初始化器&lt;br /&gt;
&lt;br /&gt;
// 调用C构造函数&lt;br /&gt;
static int _initterm_e(_PIFV * pfbegin, _PIFV * pfend) {&lt;br /&gt;
        int ret = 0;&lt;br /&gt;
&lt;br /&gt;
        // 从下到上遍历函数指针表，直到&lt;br /&gt;
        // 遇到结尾。不要跳过第一个条目。初始&lt;br /&gt;
        // pfbegin的值指向第一个有效条目。不要试图&lt;br /&gt;
        // 执行pfend指向的内容。只有pfend之前的条目才有效。&lt;br /&gt;
        while ( pfbegin &amp;lt; pfend  &amp;amp;&amp;amp; ret == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //如果当前表项非空，则通过它进行调用&lt;br /&gt;
            if ( *pfbegin != 0 )&lt;br /&gt;
                ret = (**pfbegin)();&lt;br /&gt;
            ++pfbegin;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 调用C构造函数&lt;br /&gt;
static void _initterm (_PVFV * pfbegin, _PVFV * pfend)&lt;br /&gt;
{&lt;br /&gt;
        // 从下到上遍历函数指针表，直到&lt;br /&gt;
        // 遇到结尾。不要跳过第一个条目。初始&lt;br /&gt;
        // pfbegin的值指向第一个有效条目。不要试图&lt;br /&gt;
        // 执行pfend指向的内容。只有pfend之前的条目才有效。&lt;br /&gt;
        while ( pfbegin &amp;lt; pfend )&lt;br /&gt;
        {&lt;br /&gt;
            //如果当前表项非空，则通过它进行调用&lt;br /&gt;
            if ( *pfbegin != 0 )&lt;br /&gt;
                (**pfbegin)();&lt;br /&gt;
            ++pfbegin;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 尽快调用此函数。基本上应该是你现在&lt;br /&gt;
// 就要跳转到C/C++内核中。但请记住，内核尚未初始化，&lt;br /&gt;
// 而且你不能在构造函数中使用很多东西！&lt;br /&gt;
bool CallConstructors() {&lt;br /&gt;
	// 执行C初始化&lt;br /&gt;
	int initret = _initterm_e(__xi_a, __xi_z);&lt;br /&gt;
	if ( initret != 0 ) {&lt;br /&gt;
            return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        // 执行C++初始化&lt;br /&gt;
        _initterm(__xc_a, __xc_z);&lt;br /&gt;
	return true;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==new和delete运算符==&lt;br /&gt;
你首先要做的事情之一就是实现new和delete运算符。 一开始，你还不能真正实现它们，只需要有它们的存根。 稍后，当你的内存管理器工作时，你可以完全实现它们。 下面是存根:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;void* __cdecl operator new(size_t size)&lt;br /&gt;
{&lt;br /&gt;
	// 分配内存&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void* __cdecl operator new[](size_t size)&lt;br /&gt;
{&lt;br /&gt;
	// 分配内存&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void __cdecl operator delete(void *p)&lt;br /&gt;
{&lt;br /&gt;
	if (p == 0) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// 释放分配的内存&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void __cdecl operator delete[](void *p)&lt;br /&gt;
{&lt;br /&gt;
	if (p == 0) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// 释放分配的内存&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果你想要使用placement new（定位放置new），则需要将以下实现放入一个头文件中，并在需要时将其包括在内。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;inline void* __cdecl operator new(size_t size, void* address)&lt;br /&gt;
{&lt;br /&gt;
	return address;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 另见 ==&lt;br /&gt;
===文章===&lt;br /&gt;
* [[Visual Studio]]&lt;br /&gt;
* [[C++]]&lt;br /&gt;
&lt;br /&gt;
=== 外部链接 ===&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/bb918180.aspx CRT Initialization on MSDN]&lt;br /&gt;
&lt;br /&gt;
[[Category:Compilers]]&lt;br /&gt;
[[Category:Visual C++]]&lt;/div&gt;</summary>
		<author><name>Zhang3</name></author>
	</entry>
</feed>