C语言,#define语句的用法。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言,#define语句的用法。相关的知识,希望对你有一定的参考价值。
#ifdef MY_GLOBALS
#define MY_EXT
#else
#define MY_EXT extern
#endif
MY_EXT u16 PAGE1 FBVolt;
MY_EXT u16 PAGE2 QuitDefrostTime;
MY_EXT u16 PAGE2 FanSpeed;
MY_EXT u16 PAGE2 FanOut;
MY_EXT u8 PAGE2 Fan;
MY_EXT u16 PAGE2 FeedBackCnt;
MY_EXT u8 PAGE2 LockState;
MY_EXT u8 PAGE2 TempMaxTime;
程序里面的
#define MY_EXT
怎么理解呀?
MY_EXT u8 PAGE2 TempMaxTime;
这些又怎么理解呀?这个MY_EXT是变成数据类型吗?
PAGE1、PAGE2这些又是什么?晕···求高手指点。我是编程菜鸟。学习中!谢谢~~~
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,x3...xn) 替换列表 (注意: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 ,#符号会将宏的参数进行字符串字面量化,并且加""号)
4.define的多行定义
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; 参考技术A 1.简单的define定义
#define MAXTIME 1000
一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写
if(i<MAXTIME).........
编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。
这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。
2.define的“函数定义”
define可以像函数那样接受一些参数,如下
#define max(x,y) (x)>(y)?(x):(y);
这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。
但是这样做的话存在隐患,例子如下:
#define Add(a,b) a+b;
在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了
c*a + b*d
另外举一个例子:
#define pin (int*);
pin a,b;
本意是a和b都是int型指针,但是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来代替define,这样a和b就都是int型指针了。
所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。
3.宏的单行定义
#define A(x) T_##x
#define B(x) #@x
#define C(x) #x
我们假设:x=1,则有:
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"
(这里参考了 hustli的文章)
3.define的多行定义
define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)
#define MACRO(arg1, arg2) do /
/* declarations */ /
stmt1; /
stmt2; /
/* ... */ /
while(0) /* (no trailing ; ) */
关键是要在每一个换行的时候加上一个"/" 参考技术B 这种预编译方式是为了防止重复编译,意思是,如果你预先定义了MY_GLOBALS,则MY_EXT就在本文件下有效,否则就为extern型,在本文件夹下的其他文件下也可以引用追问
请问一下PAGE这个是什么意思?什么语句哦?这也是人家的程序。您能猜到么?
追答u8 与 u16应该是8 位和 16位的类型,这里做了类型的转换,是为了将程序移植在其他平台上,至于PAGE,从字面意思和经验,应该指的是页面,结合前面的u8和u16 ,初步确定是某种平台上的说句类型
本回答被提问者采纳 参考技术C 带参宏定义c语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参宏定义的一般形式为:
#define 宏名(形参表) 字符串
在字符串中含有各个形参。
带参宏调用的一般形式为:
宏名(形参表)
例如:
#define M(y) ((y)*(y)+3*(y) /*宏定义*/
....
k=M(5); /*宏调用*/
....
在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为:
k=5*5+3*5
程序2:
#define MAX(a,b) (a>b)?a:b
main()
int x,y,max;
printf("input two numbers: ");
scanf("%d%d",&x,&y);
max=MAX(x,y);
printf("max=%d\n",max);
上例程序的第一行进行带参宏定义,用宏名MAX表示条件表达式(a>b)?a:b,形参a,b均出现在条件表达式中。程序第七行max=MAX(x,y)为宏调用,实参x,y,将代换形参a,b。宏展开后该语句为:
max=(x>y)?x:y;
用于计算x,y中的大数。
c语言define用法
参考技术A1、#ifdef:
如果有定义的#ifdef的一般形式为:#ifdef 宏替换名 语句段 #endif
含义为:如果宏替换名已被定义过,则对“语句段”进行编译;如果未定义#ifdef后面的宏替换名,则不对语句段进行编译。
2、#ifndef:
如果无定义的#ifndef的一般形式为:#ifndef 宏替换名 语句段 #endif
含义为:如果未定义#ifndef后面的宏替换名,则对“语句段1”进行编译;如果定义#ifndef后面的宏替换名,则不执行语句段。
3、#undef:
#undef命令可以删除事先定义了的宏定义。
#undef命令的一般形式如下:#undef 宏替换名
扩展资料:
c语言中define作为英文单词的含义:
define是一个英语单词,动词、名词,作动词时意为“ 定义;使明确;规定”,作名词时意为 “(Define)人名;(英)德法恩;(葡)德菲内”。
短语搭配:
flow define流程定义
Define Mask定义罩框 ; 界说罩框
define byte[计]定义字节 ; 定义字节指令 ; 伪指令 ; 字节定义
参考资料来源:百度百科-define
参考资料来源:百度百科-define
以上是关于C语言,#define语句的用法。的主要内容,如果未能解决你的问题,请参考以下文章