C语言预编译的缺点,第11章 编译和预处理 - C 语言程序设计

C语言的运行机制

源代码 –> 预处理 –> 编译 –> 汇编 –> 链接

dffff67b3a19678f717748c824f7a866.png

3dc4f1f7a725679a4ec5fb0bda398db7.png

预处理:宏替换,文件包含,条件编译

编译:词法分析,语法分析,将高级语言指令转换为功能等效的汇编代码

链接:将编译后零散的二进制代码文件组合成二进制可执行文件

编译器

7e1b141b280b30c36e5f7ed0f2ff88d7.png

预处理命令 —— 宏定义

字符串替换

无参宏定义

带参宏定义

宏定义允许嵌套

#define

#undef

宏定义中括号的使用是为了防止有关优先级的问题,若参数未加括号,很容易出错

#define PI 3.14

#undef // 取消宏定义,#undef后面的宏都不存在了

#define COMP_CIR(x) 2*PI*x

预定义宏

预定义宏

说明

__DATE__

定义源文件编译日期的宏

__FILE__

定义源代码文件名的宏

__LINE__

定义源代码中行号的宏

__TIME__

定义源文件编译时间的宏

__FUNCTION__

定义当前所在函数名的宏

带参宏与普通函数的区别(宏定义的缺陷)

b13735e63ebeaa0b5317484dcc186785.png

文件包含

除宏定义外,文件包含也是一种预处理语句,它的作用就是将一个源程序文件包含到另外一个源程序文件中。

e74b68514e7239fa8fd211ef3bdcbede.png

0854c943ed917e11f22ad17b80b5fb19.png

#include

#include "stdio"

#pragma once // 防止头文件被重复包含

#ifndef __CAL_H__ // 防止头文件被重复包含

#define __CAL_H__

#endif

# include<> 和 #include "" 区别

尖括号<>专门用来包含系统提供的头文件

双引号""包含的头文件,编译器默认会先在当前目录下寻找相应的头文件,如果没有找到然后再去系统指定的目录去寻找,如果仍未找到则提示文件不存在

4e4d81de1f42e080e45a52cdd857159f.png

条件编译

#if #else #endif

#ifdef

#ifndef

// #if #else #endif

#define SYSTEM Win32

#define DEBUG

void main(){

#if SYSTEM == Win32

printf("win32\n");

#else

printf(x64\n);

#endif

}

// #ifdef

void main(){

int i = 0;

#ifdef DEBUG

printf("i = %d\n", i);

#endif

int j = 3;

#ifdef DEBUG

printf("j = %d\n", j);

}

// #ifndef

#ifndef __FOO_H_

#define __FOO_H_

struct Foo{

int i;

};

#endif

程序调试

设置断点

单步调试

逐语句(F11,进入方法的内部)

逐过程(F10,不进入方法的内部)

观察变量

条件断点

项目调试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值