1. 应用程序类型--------只有2类:要么是CUI, 要么是GUI
2. 程序真正的启动代码(入口点函数)-----------各种**CRTStartUp
3. 环境变量+命令行信息的相关变量和函数都在此文件中有定义或声明
4. 调用运行时初始化+main()函数的最后返回和报错信息在下面的代码定义了
2
3
4
5
5. 获取进程信息+响应中断的代码如下:
6. 如果是GUI程序,则要创建“内核对象”,请参考下面的MSDN中的STARTUPINFO结构体的说明
http://www.cnblogs.com/shanzy/articles/513455.html
7. 上面的crt0.c文件中涉及到MS针对不同的CPU厂商都能够跑MS的VC编译器的CPU假设,如下面MSDN文章所说------------当然,你也可以在代码中手写下面这些MS预定义宏,或者写MAKEFILE
The compiler recognizes six predefined ANSI C macros (see Table 1.1), and the Microsoft C++ implementation provides several more (see Table 1.2). These macros take no arguments and cannot be redefined. Their value (except for __LINE__ and __FILE__) must be constant throughout compilation. Some of the predefined macros listed below are defined with multiple values. Their values can be set by selecting the corresponding menu option in the Visual C++ development environment, or by using a command-line switch. See the tables below for more information.
Table 1.1 ANSI Predefined Macros
| Macro | Description |
| __DATE__ | The compilation date of the current source file. The date is a string literal of the form Mmm dd yyyy. The month name Mmm is the same as for dates generated by the library function asctime declared in TIME.H. |
| __FILE__ | The name of the current source file. __FILE__ expands to a string surrounded by double quotation marks. |
| __LINE__ | The line number in the current source file. The line number is a decimal integer constant. It can be altered with a #line directive. |
| __STDC__ | Indicates full conformance with the ANSI C standard. Defined as the integer constant 1 only if the /Za compiler option is given and you are not compiling C++ code; otherwise is undefined. |
| __TIME__ | The most recent compilation time of the current source file. The time is a string literal of the form hh:mm:ss. |
| __TIMESTAMP__ | The date and time of the last modification of the current source file, expressed as a string literal in the form Ddd Mmm Date hh:mm:ss yyyy, where Ddd is the abbreviated day of the week and Date is an integer from 1 to 31. |
Table 1.2 Microsoft-Specific Predefined Macros
| Macro | Description |
| _CHAR_UNSIGNED | Default char type is unsigned. Defined when /J is specified. |
| __cplusplus | Defined for C++ programs only. |
| _CPPRTTI | Defined for code compiled with /GR (Enable Run-Time Type Information). |
| _CPPUNWIND | Defined for code compiled with /GX (Enable Exception Handling). |
| _DLL | Defined when /MD or /MDd (Multithread DLL) is specified. |
| _M_ALPHA | Defined for DEC ALPHA platforms. It is defined as 1 by the ALPHA compiler, and it is not defined if another compiler is used. |
| _M_IX86 | Defined for x86 processors. See Table 1.3 for more details. |
| _M_MPPC | Defined for Power Macintosh platforms. Default is 601 (/QP601). See Table 1.4 for more details. |
| _M_MRX000 | Defined for MIPS platforms. Default is 4000 (/QMR4000). See Table 1.5 for more details. |
| _M_PPC | Defined for PowerPC platforms. Default is 604 (/QP604). See Table 1.6 for more details. |
| _MFC_VER | Defines the MFC version. Defined as 0x0421 for Microsoft Foundation Class Library 4.21. Always defined. |
| _MSC_EXTENSIONS | This macro is defined when compiling with the /Ze compiler option (the default). Its value, when defined, is 1. |
| _MSC_VER | Defines the compiler version. Defined as 1200 for Microsoft Visual C++ 6.0. Always defined. |
| _MT | Defined when /MD or /MDd (Multithreaded DLL) or /MT or /MTd (Multithreaded) is specified. |
| _WIN32 | Defined for applications for Win32®. Always defined. |
As shown in following tables, the compiler generates a value for the preprocessor identifiers that reflect the processor option specified.
| Option in Developer Studio | Command-Line Option | Resulting Value |
| Blend | /GB | _M_IX86 = 500 (Default. Future compilers will emit a different value to reflect the dominant processor.) |
| Pentium | /G5 | _M_IX86 = 500 |
| Pentium Pro | /G6 | _M_IX86 = 600 |
| 80386 | /G3 | _M_IX86 = 300 |
| 80486 | /G4 | _M_IX86 = 400 |
| Option in development environment | Command-Line Option | Resulting Value |
| PowerPC 601 | /QP601 | _M_MPPC = 601 (Default) |
| PowerPC 603 | /QP603 | _M_MPPC = 603 |
| PowerPC 604 | /QP604 | _M_MPPC = 604 |
| PowerPC 620 | /QP620 | _M_MPPC = 620 |
Table 1.5 Values for _M_MRX000
| Option in Developer Studio | Command-Line Option | Resulting Value |
| R4000 | /QMR4000 | _M_MRX000 = 4000 (Default) |
| R4100 | /QMR4100 | _M_MRX000 = 4100 |
| R4200 | /QMR4200 | _M_MRX000 = 4200 |
| R4400 | /QMR4400 | _M_MRX000 = 4400 |
| R4600 | /QMR4600 | _M_MRX000 = 4600 |
| R10000 | /QMR10000 | _M_MRX000 = 10000 |
| Option in Developer Studio | Command-Line Option | Resulting Value |
| PowerPC 601 | /QP601 | _M_PPC = 601 |
| PowerPC 603 | /QP603 | _M_PPC = 603 |
| PowerPC 604 | /QP604 | _M_PPC = 604 (Default) |
| PowerPC 620 | /QP620 | _M_PPC = 620 |
8. 任何C/C++编译器的构造,都是依托于ANSI C/ANSI C++标准的,但是,由于某些历史问题当ANSI标准影响了厂商的标准,或者厂商认为某些东西更利于开发的时候,厂商会在ANSI标准提供的编译器的基础上对CRT运行时库进行扩充,扩充的结果就是上面的情况
9. 厂商扩充了ANSI标准,就需要写出一个自己的编译器(MS 的VC编译器就是cl.exe),写这个cl.exe的过程要根据厂商扩充之后的各种标准表格,在写这个cl.exe的时候做出很多的选择分支(当然,MS这里用它认为重要的一些“自定义宏”来写它的cl.exe)