tag 标签: 宏定义

相关博文
  • 热度 13
    2013-10-22 09:55
    7172 次阅读|
    0 个评论
      用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:   `define 标识符(宏名) 字符串(宏内容)   如:`define signal string   它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把程序中在该命令以后所有的signal都替换成string。这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串的过程称为“宏展开”。`define是宏定义命令。   :`define  WORDSIZE 8 module reg   data; //这相当于定义 reg data;   关于宏定义的八点说明:   1)       宏名可以用大写字母表示,也可以用小写字母表示。建议使用大写字母,以与变量名相区别。 2)       `define命令可以出现在模块定义里面,也可以出现在模块定义外面。宏名的有效范围为定义命令之后到原文件结束。通常,`define命令写在模块定义的外面,作为程序的一部分,在此程序内有效。 3)       在引用已定义的宏名时,必须在宏名的前面加上符号“`”,表示该名字是一个经过宏定义的名字。 4)       使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。而且记住一个宏名要比记住一个无规律的字符串容易,这样在读程序时能立即知道它的含义,当需要改变某一个变量时,可以只改变 `define命令行,一改全改。如例1中,先定义WORDSIZE代表常量8,这时寄存器data是一个8位的寄存器。如果需要改变寄存器的大小,只需把该命令行改为:`define  WORDSIZE 16。这样寄存器data则变为一个16位的寄存器。由此可见使用宏定义,可以提高程序的可移植性和可读性。 5)       宏定义是用宏名代替一个字符串,也就是作简单的置换,不作语法检查。预处理时照样代入,不管含义是否正确。只有在编译已被宏展开后的源程序时才报错。 6)        宏定义不是Verilog HDL语句,不必在行末加分号。如果加了分号会连分号一起进行置换 。 如: :module  test;   reg  a, b, c, d, e, out;  `define  expression  a+b+c+d; assign out = `expression + e;   ...     endmodule   经过宏展开以后,该语句为: assign  out = a+b+c+d;+e; 显然出现语法错误。 7)       在进行宏定义时,可以引用已定义的宏名,可以层层置换。如: :module test; reg  a, b, c; wire out; `define aa a + b `define cc c + `aa assign out = `cc;     endmodule 这样经过宏展开以后,assign语句为 assign  out = c + a + b; 8)       宏名和宏内容必须在同一行中进行声明。如果在宏内容中包含有注释行,注释行不会作为被置换的内容。如:   : module         `define typ_nand nand #5  //define a nand with typical delay      `typ_nand g121(q21,n10,n11);         ………         endmodule   经过宏展开以后,该语句为:   nand #5 g121(q21,n10,n11);   宏内容可以是空格,在这种情况下,宏内容被定义为空的。当引用这个宏名时,不会有内容被置换。   注意:组成宏内容的字符串不能够被以下的语句记号分隔开的。 ·         注释行 ·         数字 ·         字符串 ·         确认符 ·         关键词 ·         双目和三目字符运算符   如下面的宏定义声明和引用是非法的。 `define  first_half  "start of string $display(`first_half end of string");   注意在使用宏定义时要注意以下情况:   1)       对于某些 EDA软件,在编写源程序时,如使用和预处理命令名相同的宏名会发生冲突,因此建议不要使用和预处理命令名相同的宏名。 2)       宏名可以是普通的标识符(变量名)。例如signal_name 和 'signal_name的意义是不同的。但是这样容易引起混淆,建议不要这样使用。  
  • 热度 34
    2013-4-7 00:55
    7936 次阅读|
    5 个评论
      C语言中, 利用宏定义一个字符串 #define MYPHONE "AT+CMGS"     字符数组的方式来定义一个字符串 unsigned char SMS ="HELLO, WELCOME TO RCCTS!"; unsigned char *String; unsigned char i=0; void main() {      printf("**************this procedure is to confirm \\0 's exist****************\n"); /********************************验证MYPHONE字符串末尾是否有\0字符*************************/      String=MYPHONE;      while(*String)               //当*String所指向的字符等于\0时跳出循环      {           i=*String;           printf("%c", i);           String++;      }      if(*String=='\0'){          //再次确认字符串的末尾是否有\0字符存在           printf("\\0");          //有则打印出来      }else{           printf("**");          //没有则打印**      }      printf("\nMYPHONE=%s\n", MYPHONE);          //打印字符串 这里%s的s必须为小写 /**************验证SMS字符串末尾是否有\0字符****************/      String=SMS;      while(*String)               //当*String所指向的字符等于\0时跳出循环      {           i=*String;           printf("%c", i);           String++;      }      if(*String=='\0'){          //再次确认字符串的末尾是否有\0字符存在           printf("\\0");          //有则打印出来      }else{           printf("**");          //没有则打印**      }      printf("\nSMS=%s\n", SMS);          //打印字符串 这里%s的s必须为小写 }   运行效果图:
  • 热度 21
    2012-3-21 15:14
    4484 次阅读|
    0 个评论
      假如在主文件 main.c 中定义 #define _count_buf_size_ 100 #define _Mesure_buf_max_ 15   那么到其他c文件该宏定义就失效   宏定义只能作用到本文件结束
相关资源
  • 所需E币: 1
    时间: 2023-7-10 15:45
    大小: 863.69KB
    上传者: 张红川
    23编译器与宏定义.pdf
  • 所需E币: 1
    时间: 2022-8-3 22:45
    大小: 8.27KB
    上传者: xyzzyxaaa
    【实验90】宏定义.zip
  • 所需E币: 0
    时间: 2021-3-24 19:06
    大小: 262.16KB
    上传者: stanleylo2001
    C语言-函数与宏定义-教案
  • 所需E币: 0
    时间: 2021-3-24 19:06
    大小: 262.03KB
    上传者: stanleylo2001
    C语言-函数与宏定义-课件递归函数的设计和调用递归函数的设计和调用预处理预处理11..66综合范例综合范例1/49程序设计基础教程第九章函数与宏定函数概念函数概念C语言...
  • 所需E币: 0
    时间: 2021-3-17 17:13
    大小: 262.03KB
    上传者: czdian2005
    C语言-函数与宏定义-课件
  • 所需E币: 0
    时间: 2020-12-11 23:40
    大小: 843.5KB
    上传者: czdian2005
    C语言-函数与宏定义-课件
  • 所需E币: 0
    时间: 2020-12-11 23:40
    大小: 846KB
    上传者: czdian2005
    C语言-函数与宏定义-教案
  • 所需E币: 0
    时间: 2020-9-18 17:49
    大小: 26.03KB
    上传者: LGWU1995
    宏定义应用举例-AT89S52单片机C语言应用100例
  • 所需E币: 1
    时间: 2020-8-26 12:42
    大小: 73.28KB
    上传者: symic
    C语言宏定义技巧学习
  • 所需E币: 5
    时间: 2020-6-13 11:44
    大小: 319.03KB
    上传者: samewell
    400例-单片机C语言程序合集-宏定义应用举例.rar
  • 所需E币: 3
    时间: 2019-12-25 16:02
    大小: 330.1KB
    上传者: givh79_163.com
    FreeRTOS作为开源的轻量级实时性操作系统,不仅实现了基本的实时调度、信号量、队列和存储管理,而且在商业应用上不需要授权费。伟研科技http://www.gzweiyan.com广州伟研电子科技有限公司FREERTOS在STM32的移植伟研科技http://www.gzweiyan.comV1.0FreeRTOS作为开源的轻量级实时性操作系统,不仅实现了基本的实时调度、信号量、队列和存储管理,而且在商业应用上不需要授权费。FreeRTOS的实现主要由list.c、queue.c、croutine.c和tasks.c4个文件组成。list.c是一个链表的实现,主要供给内核调度器使用;queue.c是一个队列的实现,支持中断环境和信号量控制;croutine.c和task.c是两种任务的组织实现。对于croutine,各任务共享同一个堆栈,使RAM的需求进一步缩小,但也正因如此,他的使用受到相对严格的限制。而task则是传统的实现,各任务使用各自的堆栈,支持完全的抢占式调度。FreeRTOS的主要功能可以归结为以下几点:1)优先级调度、相同优先级任务的轮转调度,同时可设成可剥夺内核或不可剥夺内核2)任务可选择是否共享堆栈(co-routines&tasks),并且没有任务数限制3)消息队列,二值信号量,计数信号量,递归互斥体……
  • 所需E币: 5
    时间: 2019-12-25 10:31
    大小: 270.23KB
    上传者: 978461154_qq
    linux系统调用……
  • 所需E币: 5
    时间: 2019-12-24 21:50
    大小: 85.06KB
    上传者: rdg1993
    C语言宏定义技巧常用宏定义,非常不错的宏定义的只是,在课本上课时很难看到的写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等。下面列举一些成熟软件中常用得宏定义。。。。。。1、防止一个头文件被重复包含#ifndefCOMDEF_H#defineCOMDEF_H//头文件内容#endif2、重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedefunsignedcharboolean;/*Booleanvaluetype.*/typedefunsignedlongintuint32;/*Unsigned32bitvalue*/typedefunsignedshortuint16;/*Unsigned16bitvalue*/typedefunsignedcharuint8;/*Unsigned8bitvalue*/typedefsignedlongintint32;/*Signed32bitvalue*/typedefsignedshortint16;/*Signed16bitvalue*/typedefsignedcharint8;/*Signed8bitvalue*///下面的不建议使用typedefunsignedcharbyte;/*Unsigned8bitvaluetype.*/typedefunsignedshortword;/*Unsinged16bitvaluetype.……
  • 所需E币: 3
    时间: 2019-12-24 14:54
    大小: 115.8KB
    上传者: 238112554_qq
    C语言宏定义技巧(常用宏定义)C语言宏定义技巧(常用宏定义)写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等。下面列举一些成熟软件中常用得宏定义。。。。。。1,防止一个头文件被重复包含#ifndefCOMDEF_H#defineCOMDEF_H//头文件内容#endif2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedefunsignedcharboolean/*Booleanvaluetype.*/typedefunsignedlongintuint32/*Unsigned32bitvalue*/typedefunsignedshortuint16/*Unsigned16bitvalue*/typedefunsignedcharuint8/*Unsigned8bitvalue*/typedefsignedlongintint32/*Signed32bitvalue*/typedefsignedshortint16/*Signed16bitvalue*/typedefsignedcharint8/*Signed8bitvalue*///下面的不建议使用typedefunsignedcharbyte/*Unsigned8bitvaluetype.*/typedefunsigneds……