问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言,#define语句的用法。

发布网友 发布时间:2022-04-23 01:08

我来回答

4个回答

热心网友 时间:2023-10-02 13:21

  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;

热心网友 时间:2023-10-02 13:21

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 ; ) */
关键是要在每一个换行的时候加上一个"/"

热心网友 时间:2023-10-02 13:21

这种预编译方式是为了防止重复编译,意思是,如果你预先定义了MY_GLOBALS,则MY_EXT就在本文件下有效,否则就为extern型,在本文件夹下的其他文件下也可以引用追问请问一下PAGE这个是什么意思?什么语句哦?这也是人家的程序。您能猜到么?

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

热心网友 时间:2023-10-02 13:22

带参宏定义

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中的大数。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
做了好乱的梦,求解! ae缺少p1效果是要装什么插件? ...荣耀》中“网络诊断”居然可以测定酒店有无摄像头,这是好事吗? 七叶一枝花花苞里面的红米是什么 q了是什么意思? ...Q就可以,格式也没错,也只几十K,别人发给我都可以,哪里出问题了... 显的么说友Q在微 ?Q上新示怎让在说我空里动间的态不更好博 诺诗兰户外品牌怎么样 新隋唐英雄传张卫健萧妃是刘小庆吗 红尖椒和朝天椒介绍!红尖椒和朝天椒哪个辣? 1992年属什么生肖年 深圳市住房公积金贷款余额怎样查询 92年的多大了,属什么的 如何设置《相机360》为默认相机? #define在c语言中啥意思 92年属什么多大了? c语言中,使用define定义一段英文为中文,然后怎么输出呢? 新版相机360如何设密码 C语言#define是什么? 怎么用? 手机360照相机的照片保存在手机哪个文件? 92年属什么? c语言中,头文件define是什么意思。 相机360摄像头方向校正保存不了。。每次我设置好了·照出来的照片还是颠倒的·怎么解决· 华为P20pro什么时候更新emui10? 1992年属什么生肖年? 92年属什么生肖 360相机怎样把照片保存到手机相册,传到空间变的好模糊? 最新版360相机怎么取消自动保存到相册功能 1992年什么属相? 相机360自拍神器设置图文教程 【C语言】“define”是什么意思?代表什么?有什么用? 深圳查询公积金账户余额有哪些方法是怎么查询 1992出生的是属什么的 c语言中define m什么意思? 求C语言define的用法有那些? 1992年属什么生肖?? 1992年五行属什么 1992年是属什么的 C语言define可以作为用户自定义符号吗。。 1992年属猴是什么命? 1992年出生是属猴生肖多少岁 微信关闭朋友圈,别人还可以看到吗? 怎样完全关闭微信朋友圈?? 华硕X550VC可以装win10吗?装了之后会更流畅吗 在手机微信,钱包里怎么买火车票 华硕X550VC可以装64位的win10吗? 华硕x550dp能装win10吗?装了win10之后对电脑有影响吗? 微信支付可以购买火车票么? 华硕x550j可以装win10吗 华硕X550LD可以装win10吗?