广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言宏定义#define的使用
  • 286
分享到

C语言宏定义#define的使用

2024-04-02 19:04:59 286人浏览 独家记忆
摘要

目录无参宏定义定义形式 带参宏定义定义形式#和##运算 #运算 用法:##运算 用法:变参宏#ifndef 条件编译    

        宏定义是高级语言编译器提供的常用语法,其目的是利用某一标识符标识某个文本字符串。在编写程序时,如果程序中反复地使用某个数据或某段程序片段,就可以考虑将这个数据或程序片段定义为宏,然后每个出现该数据或程序片段的地方用宏名替代,选择宏定义来做的好处是程序简洁,可读性好,而且当需要修改这些相同的程序片段时,只要修改宏定义中的字符串即可,不需要修改多处。

        宏定义命令:define

       优点:方便程序的修改,同时也能提高程序的运行效率。

        宏定义一般有两种形式:无参宏定义和带参宏定义。

无参宏定义

定义形式

#define 标识符 字符串

注意:
        1.宏定义是用宏名来表示一个字符串,在宏展开时以该字符串取代宏名,只是简单的替换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理不作任何检查。只在编译时检查。
        2.宏定义行末不必加分号(除非你的宏内容中需要有分号)。
        3.宏定义必须写在函数之外,作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令 

例1:输入圆的半径输出圆的周长和面积

#include <stdio.h>
#define PI 3.14 
int main(){
    int r;
    printf("输入半径:");
    scanf("%d",&r);
	printf("圆的周长为:%.2f,面积为:%.2f",2*PI*r,PI*r*r); 
    return 0;
}

预处理阶段进行宏替换↓:

#include <stdio.h>
int main(){
    int r;
    printf("输入半径:");
    scanf("%d",&r);
	printf("圆的周长为:%.2f,面积为:%.2f",2*3.14*r,3.14*r*r); 
    return 0;
}

代码输出: 

 例2:通过宏定义输出字符串

#include <stdio.h>
#define HELLO "Hello,"
#define WORLD "World!"
int main(){
    printf(HELLO WORLD);
    return 0;
}

预处理阶段进行宏替换↓:

#include <stdio.h>
int main(){
    printf("Hello," "World!");
    return 0;
}

代码输出:

 

例3:请问如下代码S1和S2的输出是否相等

 
#include <stdio.h>
#define S1 3+4
#define S2 (3+4)
int main(){
    printf("S1:%d\n",S1*5);
    printf("S2:%d\n",S2*5);
    return 0;
}

预处理进行宏替换↓(这里就体现出了直接替换并不会因为你的宏先定义就先计算,而是替换后再做后续处理):

#include <stdio.h>
#define S1 3+4
#define S2 (3+4)
int main(){
    printf("S1:%d\n",3+4*5);
    printf("S2:%d\n",(3+4)*5);
    return 0;
}

 代码输出:

 带参宏定义

定义形式

#define 宏名(形参表) 字符串

例1:M(3)==N(3)?  M(3+2)==N(3+2)?

#include<stdio.h>
#define  M(y)  ((y)*(y)+3*(y))
#define  N(y)  (y*y+3*y)
int main(){
	printf("M(3):%d\n",M(3));
	printf("N(3):%d\n",N(3));
	
	printf("M(3+2):%d\n",M(3+2));
	printf("N(3+2):%d\n",N(3+2));
}

预处理阶段进行宏替换↓(这个例题主要是为了提醒大家如果要用宏定义进行一些计算,最好将参与计算的所有变量都加上括号以防本题中的情况出现):

#include<stdio.h>
#define  M(y)  ((y)*(y)+3*(y))
#define  N(y)  (y*y+3*y)
int main(){
	printf("M(3):%d\n",((3)*(3)+3*(3)));
	printf("N(3):%d\n",(3*3+3*3));
	
	printf("M(3+2):%d\n",((3+2)*(3+2)+3*(3+2)));
	printf("N(3+2):%d\n",(3+2*3+2+3*3+2));
}

 代码输出:

 例2:通过宏来计算数组中元素个数

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Size_Array(b) sizeof(b)/sizeof(b[0])
int main(){
	int i;
	srand((unsigned)time(NULL));
	int b[i=rand()%100];
	printf("随机数为:%d 数组元素个数为:%d",i,Size_Array(b));
}

 预处理阶段进行宏替换↓(很经典的面试小题):

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
	int i;
    srand((unsigned)time(NULL));
	int b[i=rand()%100];
	printf("随机数为:%d 数组元素个数为:%d",i,sizeof(b)/sizeof(b[0]));
}

 代码输出:

#和##运算 

#运算 用法:

        # 运算符的用处就是把符号转化为字符串。例如,如果 a 是一个宏的形参,则替换文本中的 #a 则被系统转化为 “a”。        

#include <stdio.h>
#define TO_STR(s) #s
int main(){
    printf(TO_STR(HelloWorld!));
    return 0;
}

 代码输出: 

##运算 用法:

        ## 运算符可以用在替换文本中,而它的作用是起到粘合的作用,即将两个符号组合成一个符号。

#include <stdio.h>
#define CONCAT(x,y) x##y
int main(){
    printf("%d", CONCAT(1,000));
    return 0;
}

  代码输出:

变参宏

用法:

        当要调用printf类似不确定参数格式时可以使用__VA_ARGS__,在宏定义中,形参列表的最后一个参数为省略号“…”,“__VA_ARGS__”就可以被用在替换文本中,来表示“…”代表了什么。     

#define PR(...) printf(__VA_ARGS__)     //宏定义
PR("hello\n");                          //宏调用

例:

#include <stdio.h>
#define P(X, ...) printf("get:"#X":"__VA_ARGS__)
int main(){
    int j=20,i=10;
    P(10, "j = %d\n", j); 
	P(10, "j = %d i=%d\n", j,i);      
    return 0;
}

   代码输出:

 

#ifndef 条件编译

        #ifndef 的最主要目的是防止头文件的重复包含和编译。  

        C语言中,对同一个变量或者函数进行多次声明不会报错。所以如果.h文件里进行了声明工作,不使用# ifndef宏定义,多个c文件包含同一个.h文件也不会报错。

  然而c++中,#ifdef的作用域只是在单个文件中。所以如果.h文件里定义了全局变量,即使采用#ifdef宏定义,多个.c文件包含同一个.h文件就会出现全局变量重定义的错误。

        使用#ifndef可以避免这种错误:

#ifndef x    //先测试x是否被宏定义过
#define x
   code1     //如果x没有被宏定义过,定义x,并编译code1
#endif   
  code2     //如果x已经定义过了则编译code2,跳过code1

        适当的使用条件编译和宏定义可以让代码的运行效率更高,特别是在进行大项目的时候当某个数值使用次数较多且修改比较频繁的情况下,宏定义也是比较高效的(当然函数也可以,等有时间写完函数再来比较一下函数和宏的优缺点吧) 

到此这篇关于C语言宏定义#define的使用的文章就介绍到这了,更多相关C语言宏定义#define内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言宏定义#define的使用

本文链接: https://www.lsjlt.com/news/162012.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言宏定义#define的使用
    目录无参宏定义定义形式 带参宏定义定义形式#和##运算 #运算 用法:##运算 用法:变参宏#ifndef 条件编译    ...
    99+
    2022-11-12
  • C语言#define定义宏的使用详解
    目录1.宏是什么2.宏的用法3. 宏的注意事项4. 宏和函数的区别5.命名要求6. 条件编译常见条件编译指令及应用场景1.宏是什么 #define 机制包括了一个规定,允许把参数替换...
    99+
    2022-11-13
    C语言#define定义宏 C语言 #define
  • 详解C语言#define预处理宏定义
    目录#define介绍: #define宏定义无参的一般形式为:#define  标识符 常量 #define宏定义有参的一般形式为:#define  标识符(参...
    99+
    2022-11-12
  • C语言入门篇--定义宏#define的概述
    目录1.什么是宏2.为什么要有宏?3.宏的用法3.1定义宏3.2宏常量3.3“宏函数”1.什么是宏 宏只做简单的文本替换,但一般在作为变量名出现或者在字符串中出现中是不会被替...
    99+
    2022-11-12
  • C语言中#define定义的标识符和宏实例代码
    目录1.#define定义标识符语法举个栗子2.#define定义宏#define替换的规则#与## #的用法:宏的缺点 宏和函数的优缺点     &n...
    99+
    2022-11-13
  • C语言宏定义怎么使用
    这篇文章主要讲解了“C语言宏定义怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言宏定义怎么使用”吧!一、C语言中函数的“缺陷”实参和形参之间仅仅是值传递,因此,函数中无法直接改变...
    99+
    2023-06-30
  • C语言中#define在多行宏定义出错的原因是什么
    这篇文章主要介绍了C语言中#define在多行宏定义出错的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中#define在多行宏定义出错的原因是什么文章都会有所收获,下面我们一起来看看吧。C语言...
    99+
    2023-07-05
  • C语言中#define在多行宏定义出错的原因及分析
    目录C语言中#define在多行宏定义出错的原因1.第一种错误2.第二种错误使用#define宏定义的几个小技巧1.调试开关2.条件编译3.宏实现函数4.跨行宏定义5.防止头文件被重...
    99+
    2023-02-24
    C语言#define 多行宏定义出错 C语言多行宏定义
  • C语言中的内联函数(inline)与宏定义(#define)详细解析
    先简明扼要,说下关键:1、内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样在运行时速度更快。2、内联函数可以调试,而宏定义是不...
    99+
    2022-11-15
    内联函数 宏定义
  • C语言详细分析宏定义的使用
    目录一、C语言中函数的“缺陷”二、再次理解函数三、C语言中的宏四、宏与函数的不同五、编译器组成简介六、宏使用示例七、再论宏常量八、小结一、C语言中函数的&ld...
    99+
    2022-11-13
  • C语言宏定义的扩展定义讲解
    目录1. 常量宏定义2. 定义宏函数3. 宏定义和#号结合4. 宏定义和两个#结合5. 宏定义和do…while()的结合6. #ifdef…#else&...
    99+
    2022-12-27
    C语言宏定义 C语言宏定义扩展
  • define定义函数宏的用法
    define定义函数宏的用法:1、定义简单的计算宏,“#define SQUARE(x) ((x) * (x))”;2、定义带有多个参数的宏,“#define MAX(a, b) ((a) > (b) (a) : (b))”;3、定义带有...
    99+
    2023-10-22
    define
  • C语言宏定义的用法是什么
    C语言宏定义是一种预处理指令,用于在程序编译之前进行文本替换。宏定义可以将一个标识符(通常是一个函数或常量)替换为指定的代码段或值。...
    99+
    2023-10-11
    c语言
  • C语言宏的定义与使用方法是什么
    本文小编为大家详细介绍“C语言宏的定义与使用方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言宏的定义与使用方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、C语言中的宏定义#define...
    99+
    2023-06-30
  • c语言宏定义用法规则是什么
    C语言宏定义的用法规则如下:1. 宏定义的格式为:#define 宏名 替换文本。2. 宏名必须是一个有效的C标识符,并且不可以是C...
    99+
    2023-10-11
    c语言
  • C语言深入讲解宏的定义与使用方法
    目录一、C语言中的宏定义二、宏定义表达式三、宏表达式与函数的对比四、有趣的问题五、强大的内置宏六、小结一、C语言中的宏定义 #define是预处理器处理的单元实体之一#define ...
    99+
    2022-11-13
  • C语言宏定义使用要注意哪些事项
    在使用C语言宏定义时,需要注意以下事项:1. 保持宏定义的简洁和清晰:宏定义应该尽可能简洁明了,避免过长或复杂的宏定义,以提高代码的...
    99+
    2023-10-11
    C语言
  • c语言宏定义报错怎么解决
    在解决C语言宏定义报错的问题时,我们可以尝试以下几种方法: 检查宏定义的书写格式:确保宏定义的格式正确,以及宏名称和宏值之间是否...
    99+
    2023-10-27
    c语言
  • C语言中带返回值的宏定义方式
    目录C语言中带返回值的宏定义宏定义编写宏定义分析宏定义验证经验总结C语言中一些宏定义和常用的函数typeof 关键字snprintf()函数的作用__builtin_expect的作...
    99+
    2023-02-24
    C语言返回值 C语言宏定义 C语言宏返回值
  • C语言基本概念宏定义中的#和##教程
    目录#和##是宏定义中常用的两个预处理运算符1. 记号串化(#)2. 记号黏结(##)3. 分析下列程序运行结果#和##是宏定义中常用的两个预处理运算符 其中#用于记号串化...
    99+
    2023-05-18
    C语言宏定义#和## C语言基本概念
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作