首页 > 其他分享 >预处理器

预处理器

时间:2023-05-28 11:12:15浏览次数:36  
标签:__ 定义 编译 参数 处理器 include define

预处理器

预定义符号

由预处理器定义的符号

 // 进行编译的源文件名称
    __FILE__
    // 文件当前行号
    __LINE__
    // 文件被编译的日期
    __DATE__
    // 文件被编译的时间
    __TIME__
    // 如果编译器遵循ANSI C,值为1,否则未定义
    __STDC__

#define

#define reg register//将reg定义为register修饰符,为register修饰符创建了一个别名
#define  do_forever  for( ; ; )//用do_forever代表无限循环
#define  CASE  break;case//用来方便记忆
#define peintf  \
for(int i=0;i<5;i++)\
    printf("*");
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() 
{
    peintf
    return 0;
}

#define机制包含一个设定,允许将参数替换到文本中,这种实现方式叫做宏或者定义宏

#define name(parameter-list)  stuff//宏的声明方式

举一个例子

#define  square(x)  x*x//将参数x替换为x*x
//但是这个写法是有问题的,如果有表达式square(a+1)
//那么表达式就会变为a+1*a+1,就会发生错误
//因此,可以改为(x)*(x),但是还是有问题
//如果有表达式10*add(a+1)
//表达式就变为10*(a+1)+(a+1),结果依然不对
//最终答案是((x)*(x))

来看宏的应用

#define  a  do
#define  b(x)  while((x))
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//这样a和b就构成了新的语句
int main() 
{
    int i = 0;
    a{
        printf("*\n");
        i++;
    }b(i<5);
    return 0;
}

#define的替换

在调用宏的时候,会先检查参数,观察是否有#define定义的符号,如果有他们将首先被替换

替换文本被放到原先文本的地方,对于宏,参数名被他们的值所代替

最后,再次对结果文本进行扫描,检查是否还有#define定义的符号,如果有就重复上述流程

宏与函数

相对于宏来说,函数有两点不足:一是函数的调用和返回需要的代码量较大,在简单的小型计算方面,宏相对更加具有优势,

二是函数对参数有类型要求,有着应用局限性,而宏与类型无关

但是宏的缺点是每次使用宏时都会将宏的副本复制一遍,加大代码量

下面展示一个宏比函数更有优势的例子:

#define   MALLOC(type,n)  (type,n)\
          (type*)malloc(n*sizeof(type))

宏的副作用

参数求值方面,参数每次用于宏定义时,他们都会重新求值,由于多次求值,具有副作用的参数可能产生永久性影响

#undef

解除指定的宏定义,当想重新定义一个已有宏时,需要先解除原先的宏

更多关于宏

C语言宏的定义和宏的使用方法(#define) (biancheng.net)

条件编译

条件编译的基本结构为#if指令和与其匹配的 #endif指令,如果多条件还可以增加#elif和 #else指令,#elif没有数量限制,#else只有在前面语句全部为假时才能生效

#if constant-expression
       statements;
#elif  constant-expression
        other statements;
#else  constant-expression
#endif

文件包含

#include指令使得另一个文件的内容被编译,其执行过程相对简单,预处理器将该指令删除,并用包含文件的内容代替,如果一个头文件被包含到10个源文件,那么它将被编译10次,但是这所引起的开销是不必担心的,因为这种开销非常小,且发生在编译时期,对运行效率影响不大

标签:__,定义,编译,参数,处理器,include,define
From: https://www.cnblogs.com/alexlance/p/17437921.html

相关文章

  • 计算机组成原理之中央处理器(二)
    微程序这一章,感念比较多,注意好区分。微命令就是一个一个最小的控制信号,比如说三态门中的什么什么有效,总线中的什么什么有效,以及给ALU的什么运算类型等这些最小的信号就是微命令。相对来说,这两个概念就比较好理解了。微操作就是接受微命令后部件进行的操作,例如ALU接受命令后......
  • MT8395处理器性能参数_Genio 1200芯片规格介绍资料
    联发科技(MediaTek)推出了他们的最新通用型AIoT芯片,MT8395(Genio1200)这款芯片专为高性能物联网应用和人工智能应用而设计,是一款集成了8核CPU和集成了五核图形处理器的高性能芯片。它是使用6纳米工艺制造而成的,内置了独立的双核AI处理器单元(APU),适用于用于智能家电、中控设备......
  • 3 处理器体系结构
    现代微处理器可以称得上是人类创造出的最复杂的系统之一。一块手指甲大小的硅片上,可以容纳一个完整的高性能处理器、大的高速缓存,以及用来连接到外部设备的逻辑电路。从性能上来说,今天在一块芯片上实现的处理器已经使20年前价值1000万美元、房间那么大的超级计算机相形见绌了。即......
  • 计算机组成原理学习之中央处理器
    中央处理器是控制计算机完成取指令和执行指令任务的部件;是计算机的核心部件,简称CPU。CPU的基本认功能分为四个:比较好想的就是指令控制,有指令就有操作,那就是就是操作控制,然后就是比较容易忽略的操作的时间特性,必须注意的一点是计算机类的任何操作都是在一定的周期内有条不紊的进......
  • 迅为2K1000开发板国产处理器操作系统
    1、硬件配置国产龙芯处理器,双核64位系统,板载2GDDR3内存,流畅运行Busybox、Buildroot、Loognix、QT5.12系统!2、接口全板载4路USBHOST、2路千兆以太网、2路UART、2路CAN总线、MiniPCIE、SATA固态盘接口、4G接口、GPS接口WIFI、蓝牙、MiniHDMI、温度传感器、JTAG接口等。3、开发指......
  • MT6833(天玑 700)处理器参数_芯片规格_性能_功能
    MT6833,又称为天玑700,是一款高性能芯片。它采用了八核CPU,其中包括两颗主频高达2.2GHz的ArmCortex-A76核心,可以让用户享受到更流畅的使用体验。此外,它还配备了高性能LPDDR4X内存和UFS2.2存储,可以带给用户更快的数据传输速度,使用户在玩游戏、看视频、拍照片、即时聊天或者在线......
  • 深入理解多核处理器的缓存一致性和通信机制
    操作系统级别的上下文切换操作系统级别的上下文切换是指当一个线程在执行过程中发生某种事件(如时间片用完、发生中断等),操作系统需要暂停当前线程的执行,保存其上下文(如寄存器状态、程序计数器、堆栈指针等),并切换到另一个线程继续执行的过程。这种上下文切换是由操作系统内核......
  • ARMv7-A 处理器窥探 —— MMU/TLB
    0、基本概念MMU用作虚拟地址和物理地址的相互转换,是为了能够给OS提供统一视角的虚拟地址空间;TLB的作用是作为MMU的Cache,以提高MMU的性能,他们之间的关系如下:1、ARM处理器发出地址访问(虚拟地址),首先过MMU地址翻译单元的TLB,如果TLB命中,那么直接返回真实的物理地址......
  • MT8385 处理器参数介绍 MTK8385芯片性能跑分
    联发科MT8385是一款八核处理器,以12nm台积电流片工艺打造,既高性能又低功耗。这款处理器采用四核A73和四核A53的八核设计,性能强劲,跑分在15万分以上。此外,MT8385还采用了邮票孔设计,方便二次开发。MT8385搭载了i500处理器,专门面向人工智能和物联网应用的通用型处理器。i500内置......
  • ABB中央处理器PCD230A101 3BHE022291R0101
    PCD230A1013BHE022291R0101PCD235A1013BHE032025R0101PCD235B11013BHE032025R1101CPU出现于大规模集成电路时代,处理器架构设计的迭代更新以及集成电路工艺的不断提升促使其不断发展完善。从最初专用于数学计算到广泛应用于通用计算,从4位到8位、16位、32位处理器,最后到64位处理......