首页 > 其他分享 >C语言 17 宏定义

C语言 17 宏定义

时间:2024-09-29 15:46:04浏览次数:5  
标签:include 定义 17 int C语言 PI 替换 define

前面认识了#include指令,接着来看#define指令,它可以实现宏定义。宏是啥意思?

image

把参数批量替换到文本中,这种实现通常称为(macro)或定义宏 (define macro)

可以通过#define来定义宏,规则如下:

#define 宏名(记号) 内容

比如现在想通过宏定义一个PI:

#define PI 3.1415926

这样就可以了,那么怎么去使用它呢?

#include <stdio.h>

#define PI 3.1415926

int main() {
    // 就像使用变量一样,我们可以直接将PI放到这个位置
    printf("π的值为:%f", PI);  
}
π的值为:3.141593

在编译时,预处理程序会进行宏替换操作,也就是将程序中所有的PI全部替换为3.1415926,注意这个跟类型无关,是赤裸裸的纯文本替换,也就是相当于把代码修改了,PI那里直接变成3.1415926,当然如果你定义为其他任意的内容,同样会替换到那个位置,但是至于替换之后程序还正不正常就不知道了。

通过下面这个例子来加深对文本替换这句话的理解:

#include <stdio.h>

#define M a + b

int main() {
    int a = 10, b = 20;
    printf("%d", M * a);
}
210

如果按照一般思维,M 是 a + b,那么替换上去之后应该就是 30,然后 30 x 10 最后得到的应该是 300 才对。

怎么会算出来是 210 的呢?

实际上在编译时仅仅是做了文本替换,相当于最后的代码是:

printf("%d", a + b * a);

最后结果就是 210 了。

当然任何地方都可以使用宏替换,包括类型,反正最后都会变成被替换的内容:

#define lbwnb long

int main() {
    lbwnb a = 10L;
}

当然除了这种简单的替换之外还可以添加参数,就像函数那样:

#include <stdio.h>

#define MUL(x) x * x

int main() {
    printf("%d", MUL(9));
}
81

虽然这里搞得像函数一样,但是最后还是会被替换为 x * x,而这个 x 就是填写的参数,所以最后会变成 9 * 9 替换上去,程序运行出来的结果就是 81 了。

直接调函数肯定也是没问题的,反正就纯替换:

#include <stdio.h>

#define bb(i) printf("我是宏替换的:%d", i);

int main() {
    bb(666);
}
我是宏替换的:666

那要是想在字符串里面加一个宏定义中的参数呢?

#include <stdio.h>

// 使用#直接在字符串中进行宏替换,否则默认情况下会被当做一个字符
#define bb(str) printf("我是宏替换的:" #str " <");  

int main() {
    bb("替换成功");
}
我是宏替换的:"替换成功" <

当然还可以替换宏中的部分:

// ##会使用参数进行拼接
#define TEST(n) x##n  

int main() {
    // 这里传入1,那么实际上就是被替换为x1
    int TEST(1) = 10;  
    // 所以上面其实是int x1 = 10
    x1 = 20;           
}

宏既然可以定义出来,那么也可以取消定义,可以使用#undef来取消已有的宏定义:

可以看到在使用#undef之后,直接不认识了。

当然除了我们自己可以去定义之外,系统也为我们提供了一些预定义的宏:

宏名称 含义
_ _ DATE _ _ 当前的日期,格式为类似 Jun 27 2023 的字符串
_ _ TIME _ _ 当前的时间,格式为类似 10:23:12 的字符串
_ _ FILE _ _ 当前源代码文件的名称(含路径)的字符串
_ _ LINE _ _ 当前所处的行号是多少就替换为多少,整数

这里只列出了一部分。


环境:

  • GCC 11.4.0
  • VSCode 1.93.1

标签:include,定义,17,int,C语言,PI,替换,define
From: https://www.cnblogs.com/skysailstar/p/18440128

相关文章

  • C语言 18 条件编译
    再来看看条件编译,还可以根据条件,选择性地对某些内容进行忽略。来认识一下#ifdef、#else、#endif这三种条件编译指令:#include<stdio.h>//ifdef用于判断是否定义了符号PI,如果没有的话则处理以下的指令#ifdefPI#defineM666//如果定义了符号PI,那么就处理这个分支的语......
  • 基于qwen2.5 手把手实战 自定义数据集 微调(llama-factory)
    基于qwen2.5手把手实战自定义数据集微调(llama-factory)准备工作1.数据集准备(例:民法典.txt)2.服务器准备(阿里云DSW白嫖)3.环境配置pip升级模型下载微调助手4.数据集处理脚本文件4.1文本分割(bert-base-chinese)4.2数据集生成4.3.1数据集转换(只有一个数据集)alpaca格式......
  • PbootCMS自定义前台404错误页面
    以下是一个简单的404错误页面示例代码:<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>......
  • The 2023 ICPC Asia Jinan Regional Contest (The 2nd Universal Cup. Stage 17: Jina
    赛时4题,策略重大失误,g题思路假了但是以为是代码问题硬调3.5h,m题本来是可以过的,e是网络流说不定也能过呢。xixike大力平衡树直接打过k题省去思考双优先队列算法的时间,太强A观察到同级同形状括号如果有四个就一定可以交换顺序,而且是充要的,经典括号匹配用栈存储就过了,我代码比较丑......
  • C语言课程设计:基于C语言的银行管理系统【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:C开发工具:VScode二、系统功能1.客户管理:包括客户信息的增删改查、客户身份验证、客户分组等功能。2.账户管理:包括账户的开户、销户、冻结、解冻、查询、......
  • mybatis基于注解、XML配置文件的形式来定义SQL语句
    一、mybatis基于注解定义SQL语句员工类@Data@NoArgsConstructor//无参@AllArgsConstructor//有参publicclassEmp{privateIntegerid;//idprivateStringusername;//用户名privateStringpassword;//密码privateStringname;//姓名privat......
  • java 警告:源发行版17 需要目标发行版17
    问题:在从网上复制的项目想要在本地部署,或者本地有多个jdk版本,在开启项目时容易出现jdk版本不一致的问题,导致项目不能运行起来。解决:解决这种问题主要时修改各个模块的jdk版本,使之一致。即确保以下几个地方的版本一致1、在ProjectStructure的Project下确保SDK和Languagel......
  • 学期2024-2025-1 学号 20241317 《计算机基础与程序设计》第1周学习总结
    这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01这个作业的目标 1.基于VirtualBox虚拟机安装Ubuntu和安装Linux系统2.快速浏览一遍教材计算机科学概论(第七版),课本每章提......
  • PTA 实验三 零基础JAVA语言学习 6-3 定义游客类
    6-3定义游客类分数20全屏浏览切换布局作者 fpc单位 内蒙古师范大学定义游客类(其测试类已给出),要求如下:一个景区根据游人的年龄收取不同价格的门票。请编写游客类,根据年龄段决定能够购买的门票价格并输出当输入的年龄小于18或者大于60(不包括18,60)时,程序输出:年龄......
  • PTA 实验三 零基础JAVA语言学习 7-1 复数类的定义 要想编写一个复数类,可以进行复数加
      要想编写一个复数类,可以进行复数加法和减法运算。编写一个包含main方法的类测试该复数类。要求该复数类至少包含一个无参的构造方法和一个带参的构造方法;数据成员包括复数的实部和虚部,为double类型;包括两个方法,分别实现复数的加法和减法运算。测试代码如下:publicsta......