
1简单的宏定义
格式:#define 标识符 替换列表
说明:替换列表可以是数,字符串字面量,标点符号,运算符,标识符,关键字,字符常量。
注意:替换列表是可以为空的
典型错误:
#define N = 100int a[N]; /这样会成为int a[= 100],这里会处理成为一种标识记号一样/
#define N 100;
int a[N]; /带分号的定义会成为int a[100;],这是一种很常见的错误/
#define pin (int);
pin a,b;
int a,b; /本意是a和b都是int型指针,但是实际上变成int a,b;a是int型指针,而b是int型变量。这是应该使用typedef来代替define,这样a和b就都是int型指针了。/
典型的使用方法:
使用宏定义可以自己根据自己的习惯来定义甚至改变C语言的语法习惯,例如:
#define BEGIN {#define END }
int main()BEGIN
printf ("DEFINE----\n");
END
定义一个循环
#define LOOP for(;;)重新定义数据类型
#define IT int2带参数的宏
#define 标识符(x1,x2,x3xn) 替换列表 (注意:x1,x2,x3是宏的参数,标识符和其左括弧之间不能有空格)
使用方法:
#define MAX(x,y) ((x)>(y)(x):(y))i=MAX(j+k,m-n);
替换为:
i=MAX((j+k)>(m-n)(j+k):(m-n));#define SI_EX(n) ((n)%2==0)
if(SI_EX(i)) i++;
替换为:
if(SI_EX((i)%2==0))通过以上例子可以看出,标识符带参数(X1,X2,X3)在替换时会被替换列表(Y1,Y2,Y3)对应的替换,但是和顺序无关。
3宏的特殊单行定义
#define A(x) T_##x#define B(x) #@x
#define C(x) #x
x=1
替换为:
A(1)------> T_1 (T_##x,##符号是记号粘黏符号,将前后的字符粘黏起来。)
B(1)------> '1' ( #@x , #@ 符号会将宏的参数进行字符串字面量化,并且加‘’号)
C(1)------> "1" ( #x ,#符号会将宏的参数进行字符串字面量化,并且加""号)
4define的多行定义
define可以替代多行的代码,在每一个换行的时候加上一个"\"
#define MAX(X,Y) do { \语句1; \
语句2; \
/ 注释的写法 / \
} while(0) / (no trailing ; ) / \
5在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。
#ifdef WINDOWS#endif
#ifdef LINUX
#endif
可以在编译的时候通过#define设置编译环境
6取消宏
#undef 标识符7条件编译
#ifdef XXX…(#else) … #endif8预定义宏
在C语言中收录了一些有用的宏,这些宏是提供当前编译信息的。
__LINE__ 被编译文件的行数
(整型)
__FILE__ 被编译文件的名字 (字符型)
__DATE__ 编译日期 (字符型)
__TIME__ 编译时间 (字符型)
__STDC__ 如果编译器接受标准C,那么值为1 (整型)
通常在编译的时候可以用这些预定义的宏来进行排错,例如:
一般情况下,当出现除零的情况时编译器是没有提示的,可以自定义一个解决办法。
#define CHECKZERO(divisor)\if(divisor==0)\
printf("ATTEMPT TO DIVIDE BY ZERO IN LINE %d of file %s \n",__LINE__,__FILE__);\
引用方法
CHECKZERO(j);k=i/j;
#define 是宏定义,在预编译的时候就会处理而EQU是在程序里的给变量赋值他们之间在给变量赋值上就这么点区别,#DEFINE的作用很多,多用就会有体会说的不太好,大概就这么个意思,希望不要把你毒害了
作用:
在C或C++语言中,“宏”分为有参数和无参数两种。
被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。
宏定义的作用范围仅限于当前文件,即file1.c中定义#definePI3.14,在file2.c中该宏定义不起作用;通过将#definePI3.14
定义在common.h中,file1.c和file2.c分别#include"common.h"的方式,该宏定义在file1.c和file2.c中都起作用。
扩展资料无参宏定义
无参宏定义的一般形式为:#define 标识符 字符串
其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。
例如:
#define M (a+b) 它的作用是指定标识符M来代替表达式(a+b)。在编写源程序时,所有的(a+b)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(a+b)表达式去置换所有的宏名M,然后再进行编译。
程序1:
#include<stdioh>
#define M (a+b)
int main(void)
{
int s,a,b;
printf("inputnumbera&b:");
scanf("%d%d",&a,&b);
s = MM;
printf("s=%d\n",s);
}
上例程序中首先进行宏定义,定义M来替代表达式(a+b),在 s= M M 中作了宏调用。在预处理时经宏展开后该语句变为: S=(a+b)(a+b)但要注意的是,在宏定义中表达式(a+b)两边的括号不能少。否则会发生错误。
如当作以下定义后:#define M (a)+(b) 在宏展开时将得到下述语句:S= (a)+(b)(a)+(b)
对于宏定义还要说明以下几点:
1、宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。
2、宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
3、宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。(有关#undef 请查阅其它资料)
参考资料:
百度百科——define(计算机专业用语)
getchar
由宏实现:#define
getchar()
fgetc(stdin)。getchar有一个int型的返回值当程序调用getchar时程序就等着用户按键用户输入的字符被存放在键盘缓冲区中直到用户按回车为止(回车字符也放在缓冲区中)当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键
所以输入w、回车后,缓冲区中有两个字符,下一次循环读取的是回车,getchar不等待用户输入,就直接返回,显示两行aaa,同理,如输入ww、回车,会显示三行aaa,至于为什么输入qq才读到一个q,不知道是什么问题。
#define 就是一定义宏的 工具
是在编译过程中 把程序正文中 的定义字串 替换成 被定义的字串,这样做一个方面是为了
1 程序容易阅读
2 程序修改参数方便
3 减少程序中打错字
等
可以用它来实现 常数 的定义 宏函数 其他语言的编程风格 甚至其他不伦不类的东西等
地址常数也是常数 ,只不过表示了某存储器(或端口)的位置而已
一般表示 地址使用16进制或二进制表示(任何进制都可以),
而一般常数多数使用10进制容易理解,有些也用2进制8进制或16进制
主要还是为了方便阅读
不只到你的 寄存器 是什么寄存器 硬件外设?
外设 IO 有函数 不可以直接赋值
内存的存储器可以直接赋值
cpu 的寄存器没有这种地址标识,高级语言一般也不需要关心,编译程序自动管理
不同的开发平台都有自己的软件包 控制外设,具体请参考你的开发平台的参考手册
符号常量在使用之前必须先定义,其一般形式为:
#define 标识符 常量
enum EnumName{标识符,标识符,};
其中#define 也是一条预处理命令(预处理命令都以#开头),称为宏定义命令,其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。
枚举类型中的元素也是符号常量,如enum Weekday{SUN, MON, TUES, WED, THU, FRI, SAT}。
例:
#include<stdioh>
#define PRICE 30
main()
{
int num,total;
num=10;
total=num PRICE;
printf(total=%d,total);
}
使用符号常量的好处是:
含义清楚;
能做到“一改全改”。
以上就是关于C语言,#define语句的用法。全部的内容,包括:C语言,#define语句的用法。、c语言中#define和equ的区别是什么、在C++中#define的作用是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)