当前位置:网站首页>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

}

 测试结果

原网站

版权声明
本文为[Love coldplay]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_40933653/article/details/123946677