前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >预处理详解

预处理详解

作者头像
lovevivi
发布2022-11-10 14:44:46
5810
发布2022-11-10 14:44:46
举报
文章被收录于专栏:萌新的日常

一、预处理符号

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
#include<stdio.h>
int main()
{
 printf("%s\n",__FILE__);//输出该文件所在具体位置
 printf("%d\n",__LINE__);//行号 所以用%d
 printf("%s\n",__DATE__);//目前所处的日期
 printf("%s\n",__TIME__);//目前所处的时间
 }

二、#define作用

1.#define定义符号

(1).定义为常量

定义为常量时 将宏替换到代码中 是在预处理阶段

代码语言:javascript
复制
#define M 1000
#include<stdio.h>
int main()
{
 int ret=M;
 printf("%d\n",ret);
 return 0;
 }

(2).为关键字创建一个简短的名字

代码语言:javascript
复制
#define reg register
#include<stdio.h>
int main()
{
 reg int sum=1000;
 return 0;
}

(3).用符号替换一种实现

代码语言:javascript
复制
#deifne do_forever for(;;)
int main()
{
 do_forever;//for(;;); 死循环
 return 0;
}

(4).在#define后面加分号

代码语言:javascript
复制
#define M 1000;
int main()//这里程序会报错
{
 int a=5;
 int b=8;
 if(a<10)
  a=M;//这里宏替换后是 a=1000;; 多的分号自成一个语句 多个语句需要括号
  else
  b=0;
  return 0;
}

2.#define定义宏

(1).机制

在这里插入图片描述
在这里插入图片描述

(2).宏的申明方式

#define name(parament-list) stuff 这里切记 name与左括号紧贴着 否则将会被视为转换内容 stuff的一部分

(3).练习题

注意这里是要把整体传过去再运算

代码语言:javascript
复制
#define square (x) x*x
int main()
{
 printf("%d\n",square(3+1));//3+1传过去替换x 3+1*3+1=7
 return 0;
}
代码语言:javascript
复制
#define square(x) x+x
int main()
{
 printf("%d\n",10*square(4));//将4传过去替换x  即10*4+4=44
 return 0;
}

三、#和##

1.#

#作用是找到该对象所对应内容的字符串

代码语言:javascript
复制
#define PRINT printf("the value of" #x"is %d\n",x)
int main()
{
 int a=10;
 PRINT(a);
 int b=5;
 PRINT(b);
 return 0;
}

只要是字符串 不管是几个 都能正常输出 #x代表x所对应的内容的字符串 替换过来 #x 为"a"/"b" printf("the value of " "a" "is %d\n",a);

2.##

##代表将两个字符连在一起

代码语言:javascript
复制
#define cat(x,y) x##y
int main()
{
 int yourage=20;
 printf("%d\n",cat(your,age));//将your和age连接起来 为yourage再计算 为20
 return 0;
}

将 your##age--->yourage

四、带副作用的宏参数

代码语言:javascript
复制
#define max(x,y) x>y?x:y
int main()
{
 int a=5;
 int b=8;
 int ret=max(a++,b++);
 printf("%d\n",ret);
 return 0;
}

将a++和b++替换带宏中为 a++>b++?a++:b++ a为5 b为8 5>8为假 表达式结束 两者都加1 a为6 b为9 传入 b++中 将b给予ret 即ret为9 表达式结束后 b加1 即b为10

五、宏和函数的对比

在这里插入图片描述
在这里插入图片描述

六、条件编译

1. #undef

用于移除宏定义

代码语言:javascript
复制
#define M 1000
int main()
{
 int a=M;
 #undef M
 printf("%d\n",M);//这里会报错 因为 M的宏定义被移除了
 return 0;
}

2. 与//相同作用的移除

代码语言:javascript
复制
#ifdef 0
#define M 1000
int main()
{
 int a=M;
 printf("%d\n",a);
 return 0;
}
#endif

#ifdef 0 0为假 不执行下面的内容 相当于//的作用

3.多个分支条件编译

代码语言:javascript
复制
#include<stdio.h>
int main()
{
  #ifdef 1==1//1==1为真 执行下面内容 输出hehe
  printf("hehe\n");
  #elif 1==2//为假 跳过下面内容
  printf("hehe\n);
  #else//都不成立 执行hehe
  printf("hehe\n");
  #endif
  return 0;

4.判断是否被定义

代码语言:javascript
复制
#define PRINT 
int main()
{
 #ifdef PRINT
 printf("hehe\n");//如果PRINT没定义 则不参与编译
 #endif
 return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、预处理符号
  • 二、#define作用
    • 1.#define定义符号
      • (1).定义为常量
      • (2).为关键字创建一个简短的名字
      • (3).用符号替换一种实现
      • (4).在#define后面加分号
    • 2.#define定义宏
      • (1).机制
      • (2).宏的申明方式
      • (3).练习题
  • 三、#和##
    • 1.#
      • 2.##
      • 四、带副作用的宏参数
      • 五、宏和函数的对比
      • 六、条件编译
        • 1. #undef
          • 2. 与//相同作用的移除
            • 3.多个分支条件编译
              • 4.判断是否被定义
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档