Cherno c++ learning -- c++ compiler

本文深入探讨了C++预处理阶段的工作原理,包括头文件包含、宏定义及条件编译指令的处理方式。通过具体实例展示了编译器如何处理EndBrace.h中的大括号闭合和Math.cpp中的宏定义,揭示了预处理阶段对源代码的实际影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.preprocessing

#include --->compiler 找到include的file,并复制到当前的.cpp file

#define

#ifdef

#endif 

看个例子1

EndBrace.h

}

log.cpp

#include<iostream>
void Print() {
	std::cout << "Hello" << std::endl;
#include "EndBrace.h"

编译成功!

 

 这是因为编译器把EndBrace.h中的 } 复制粘贴到了log.cpp中---》

#include<iostream>
void Print() {
	std::cout << "Hello" << std::endl;
#include "EndBrace.h"

相当于

#include<iostream>
void Print() {
	std::cout << "Hello" << std::endl;
}

 例子2

Math.cpp

#define INTEGER int
INTEGER Mul(INTEGER a, INTEGER b) {
	return a * b;
}

看到编译文件:

 

 

Math.i --->#define

 

 

Math.i --->#if

 

 


 2.编译

编译lambda.sln 后可以得到---> lambda.obj log.obj 

查看 .asm file

 

Math.asm

; Listing generated by Microsoft (R) Optimizing Compiler Version 19.16.27024.1 

	TITLE	F:\Cherno-C++\Cherno_c++\lambdas\Math.cpp
	.686P
	.XMM
	include listing.inc
	.model	flat

INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES

msvcjmc	SEGMENT
__4803B6A9_math@cpp DB 01H
msvcjmc	ENDS
PUBLIC	?Mul@@YAHHH@Z					; Mul
PUBLIC	__JustMyCode_Default
EXTRN	@__CheckForDebuggerJustMyCode@4:PROC
EXTRN	__RTC_CheckEsp:PROC
EXTRN	__RTC_InitBase:PROC
EXTRN	__RTC_Shutdown:PROC
;	COMDAT rtc$TMZ
rtc$TMZ	SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ	ENDS
;	COMDAT rtc$IMZ
rtc$IMZ	SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
rtc$IMZ	ENDS
; Function compile flags: /Odt
;	COMDAT __JustMyCode_Default
_TEXT	SEGMENT
__JustMyCode_Default PROC				; COMDAT
	push	ebp
	mov	ebp, esp
	pop	ebp
	ret	0
__JustMyCode_Default ENDP
_TEXT	ENDS
; Function compile flags: /Odtp /RTCsu /ZI
;	COMDAT ?Mul@@YAHHH@Z
_TEXT	SEGMENT
_a$ = 8							; size = 4
_b$ = 12						; size = 4
?Mul@@YAHHH@Z PROC					; Mul, COMDAT
; File f:\cherno-c++\cherno_c++\lambdas\math.cpp
; Line 2
	push	ebp
	mov	ebp, esp
	sub	esp, 192				; 000000c0H
	push	ebx
	push	esi
	push	edi
	lea	edi, DWORD PTR [ebp-192]
	mov	ecx, 48					; 00000030H
	mov	eax, -858993460				; ccccccccH
	rep stosd
	mov	ecx, OFFSET __4803B6A9_math@cpp
	call	@__CheckForDebuggerJustMyCode@4
; Line 3
	mov	eax, DWORD PTR _a$[ebp]
	imul	eax, DWORD PTR _b$[ebp]
; Line 4
	pop	edi
	pop	esi
	pop	ebx
	add	esp, 192				; 000000c0H
	cmp	ebp, esp
	call	__RTC_CheckEsp
	mov	esp, ebp
	pop	ebp
	ret	0
?Mul@@YAHHH@Z ENDP					; Mul
_TEXT	ENDS
END

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值