当前位置:网站首页>C语言笔记 学习预处理 学习宏定义
C语言笔记 学习预处理 学习宏定义
2022-08-09 07:56:00 【Love coldplay】
1、 # 预处理指令
//指令用途
# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前#if条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信
2、预处理的内容:头文件的包含、宏定义、条件编译
#define 标识符 字符串
其中标识符就是所谓的符号常量,也称为“宏名”
举例1 学习数组长度
#define N 20
int a[N] //替换20后,再编译
宏定义说明:
(1) 宏名一般用大写;
(2) 使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数
组大小常用宏定义;
(3) 预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查;
(4) 宏定义末尾不加分号;
(5) 宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头;
(6) 可以用#undef命令终止宏定义的作用域;
(7) 宏定义允许嵌套;但是注意要在嵌套之前进行定义
(8) 字符串("")中永远不包含宏;
(9) 宏定义不分配内存,变量定义分配内存;
(10)宏定义不存在类型问题,它的参数也是无类型的。
(11) 宏定义多条语句记得加分号分割,结束不加分号
(12)如果不想再使用某条宏定义了,可以使用 #undef+宏名 取消已定义的宏
(13)宏定义多项式,先替换后定义
(14)全局和局部同名的时候,优先使用局部
(15)先替换 后计算
3、程序编译的四步:预处理、编译、汇编、链接
预处理阶段。预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。比如hello.c中第一行的#include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,结果就得到了另一个C程序,通常是以.i作为文件扩展名。
编译阶段。编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令。
汇编阶段。汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言指令而不是字符,如果我们在文本文件中打开hello.o文件,看到的将是一堆乱码。
链接阶段。链接器(ld)负责处理合并目标代码,生成一个可执行目标文件,可以被加载到内存中,由系统执行。
// 学习预处理.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/* 2022 04 02*/
//学习预处理
/*
1、 # 预处理指令
2、预处理的内容:头文件的包含、宏定义、条件编译
3、程序编译的四步:预处理、编译、汇编、链接
//指令用途
# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前#if条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息
#define 标识符 字符串
//其中字符串没有数据类型
//举例1 其中标识符就是所谓的符号常量,也称为“宏名”
学习数组长度
#define N 20
int a[N] //替换20后,再编译
说明:
(1) 宏名一般用大写;
(2) 使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义;
(3) 预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查;
(4) 宏定义末尾不加分号;
(5) 宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头;
(6) 可以用#undef命令终止宏定义的作用域;
(7) 宏定义允许嵌套;但是注意要在嵌套之前进行定义
(8) 字符串("")中永远不包含宏;
(9) 宏定义不分配内存,变量定义分配内存;
(10)宏定义不存在类型问题,它的参数也是无类型的。
(11) 宏定义多条语句记得加分号分割,结束不加分号
(12)如果不想再使用某条宏定义了,可以使用 #undef+宏名 取消已定义的宏
(13)宏定义多项式,先替换后定义
(14)全局和局部同名的时候,优先使用局部
(15)先替换 后计算
*/
#include <iostream>
#define PI 3.1415926
#define PM float c;float s;c = 2 * PI*r;s = PI * r*r
#define CMP(a,b) (a>b) ? a:b
#define EW(x) x*x
#define EM(x) (x)*(x)
#define A 3
#define B(A) (A+1)*3
using namespace std;
int main()
{
float r = 100;
//float c;
//float s;
//c = 2 * PI*r;
//s = PI * r*r;
PM;
cout << "c=" << c << endl;
cout << "s=" << s << endl;
int a = 3;
int b = 4;
int sum;
sum = CMP(a, b);
cout << "第一次sum=" << sum << endl;
// #define E(x) x*x
sum = EW(a + b); // a + b*a + b 3+4*3+4=19
cout << "第二次sum=" << sum << endl;
sum = EM(a + b);
cout << "第三次sum=" << sum << endl; //(a + b)*(a + b)
//#define A 3
//#define B(A) (A+1)*3
sum = A + B(7);
cout << "第四次sum=" << sum << endl; // 3+(7+1)*3
}
测试结果
边栏推荐
- C语言:字符逆序
- Kotlin协程 - 异常处理
- 3D软件开发工具HOOPS全套产品开发介绍 | HOOPS Exchange、HOOPS Communicator
- Use tensorflow.keras to build a neural network model modularly
- Four departments including the Ministry of Industry and Information Technology promote green smart home products to the countryside
- 实现弹簧柔性状态的2种方式 | Solidworks教程
- Snake game, C language
- CUDA和cuDNN 安装10.0版本
- [STL]vector
- libtorch示例
猜你喜欢
C language: adjust the order of odd and even numbers
RAID配置实战
3D精彩案例,清软英泰建成综合轻量化显示平台!
Learning Notes---Machine Learning
DIMP:Learning Discriminative Model Prediction for Tracking 学习判别模型预测的跟踪
pc端ncnn搭建与测试
SSM integration development case
【无标题】
String类创建的对象在JVM中的内存分配和equals与==的区别
MDK Keil debug时, watch1中全局变量不更新
随机推荐
Four departments including the Ministry of Industry and Information Technology promote green smart home products to the countryside
js数组相关知识复习
LeetCode·每日一题·761.特殊的二进制序列·分治
(五)、马尔科夫预测模型
Invoker 2019CCPC Qinhuangdao Station I Question Simple DP
RAID配置实战
[STL]string
LeetCode·每日一题·636.函数的独占时间·栈模拟
Luogu P1110 report statistics multiset stl good question
训练好的深度学习模型,多种部署方式
种子数据报错:liquibase.exception.ValidationFailedException: Validation Failed
VOC format label to YOLO format
三层交换机原理及配置
ssh:connect to host master port 22:Network is unreachable
原生JDBC操作数据库
CoCube传感器MPU6050笔记
C语言:字符逆序
接口测试概念
Anaconda 更换默认虚拟环境
贪吃蛇小游戏——C语言