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 = 100
  int 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 int

  2.带参数的宏

  #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) â€¦ #endif


  8.预定义宏

  在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;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-18
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 ; ) */
关键是要在每一个换行的时候加上一个"/"本回答被网友采纳
第2个回答  2012-07-18
这种预编译方式是为了防止重复编译,意思是,如果你预先定义了MY_GLOBALS,则MY_EXT就在本文件下有效,否则就为extern型,在本文件夹下的其他文件下也可以引用追问

请问一下PAGE这个是什么意思?什么语句哦?这也是人家的程序。您能猜到么?

追答

u8 与 u16应该是8 位和 16位的类型,这里做了类型的转换,是为了将程序移植在其他平台上,至于PAGE,从字面意思和经验,应该指的是页面,结合前面的u8和u16 ,初步确定是某种平台上的说句类型

本回答被提问者采纳
第3个回答  2012-07-18
带参宏定义

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中的大数。
相似回答