C语言中的宏

1.不带参数的宏定义:宏定义又称为宏代换、宏替换,简称“宏”。格式:#define 标识符 字符串其中的标识符就是所谓的符号常量,也称为“宏名”。预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。即在对相关命令或语句的含义和功能作具体分析之前就要换:例:#define PI 3.1415926把程序中出现的PI全部换成3.1415926说明:(1)宏名一般用大写(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。(4)宏定义末尾不加分号;(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。(6)可以用#undef命令终止宏定义的作用域(7)宏定义可以嵌套(8)字符串" "中永远不包含宏(9)宏定义不分配内存,变量定义分配内存。2.带参数的宏:除了一般的字符串替换,还要做参数代换格式:#define 宏名(参数表) 字符串例如:#define S(a,b) a*b     area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;类似于函数调用,有一个哑实结合的过程:(1)实参如果是表达式容易出问题            #define S(r) r*r            area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;            正确的宏定义是#define S(r) (r)*(r)(2)宏名和参数的括号间不能有空格(3)宏替换只作替换,不做计算,不做表达式求解(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存(5)宏的哑实结合不存在类型,也没有类型转换。(6)函数只有一个返回值,利用宏则可以设法得到多个值(7)宏展开使源程序变长,函数调用不会(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
时间: 2024-11-03 03:31:25

C语言中的宏的相关文章

C语言学习笔记--C语言中的宏定义

1. C 语言中的宏定义 (1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)(3)#define 定义之后的代码都可以使用这个宏 2. 定义宏常量 (1)#define 定义的宏常量可以直接使用(2)#define 定义的宏常量本质为字面量 3. 宏定义表达式 (1)#define 表达式的使用类似函数调用(2)#define 表达式可以比函数更强大(3)#define 表达式比函数

黑马程序员------C 语言学习笔记---C语言中的宏定义

1.5    C语言程序的运行过程 01 源程序:由高级语言或汇编语言编写,C语言源程序的扩展名为.C 02 目标程序:源程序经“编译程序”翻译所得的二进制代码为目标程序,其扩展名为.obj 03 可执行程序:目标程序与库函数连接,形成可执行程序,.out #include <stdio.h> int main() { #define PI 3.14 double r,len,area; printf("请输入半径:\n"); // 提示用户输入半径 scanf("

c语言中的宏定义的学习体会

在学习stm32的过程中遇到关于宏定义的问题,所以,写出来大家一起学习一下 问题出处: 其中\是语言中的转义字符,用来连接上下文,因为宏定义只能是一个串,而当你的串过长(超过一行的时候)时,就需要换行了,此时就需要\来连接上下文. 下面是成熟软件中常用到的宏定义: 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植. typedef 

20个C语言中常用宏定义总结

01: 防止一个头文件被重复包含 #ifndef COMDEF_H#define COMDEF_H//头文件内容#endif 02: 重新定义一些类型防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植. typedef  unsigned char      boolean;     /* Boolean value type. */typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */typedef

c语言中使用宏,需要注意的的几点

使用#define来定义一些宏,进行一些简洁的替换甚至一些带参数的宏,在linux c代码中很常见,说明它很好.很有用, 但是它也有一些复杂的规矩和陷阱需要注意,下面我记录一些,仅供参考. 1.当使用"\"来换行时,第二行要顶格写,否则会多出一个空格.例如: #define OW "what are you doi    \       ng?"第二行的ng?"没有顶格写,那么进行替换的时候,会这样:what are you doi        ng?正

C语言中的宏展开

#include<stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n",h(f(1,2))); 宏h(a) 是g(a),没有#,所以需要进行宏展开 printf("%s\n",g(f(1,2))); //宏g(a) 有#,所以不展开 return 0; } 如何展开宏函数的规则:在展开当前宏函数时,如果形参有#或##则不进行宏参数

C语言中宏定义使用方法详解

C语言中的宏替换详解 首先看一个问题: #include <stdio.h> #define    PRINT_CLINE()    printf("%d", ______) int main(void) { PRINT_CLINE(); PRINT_CLINE(); return 0; } 在横线处填上适当的代码,使得上面这段代码的输出为34. 我想一般人看到这个问题的时候头脑里都没有明确的思路来解答这个它.我看到这个问题的时候想出了各种办法来解答它,最终还是没有通过编译

简单讲解C语言中宏的定义与使用

宏定义是预编译功能的一种, 预编译又称为预处理, 是为编译做的预备工作的阶段.处理#开头的指令, 比如拷贝 #include 包含的文件代码,#define宏定义的替换,条件编译等. 使用宏定义的好处:使用宏定义的好处:可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改.例如 π 这个常量,我们有时候会在程序的多个地方使用,如果每次使用都重新定义,一来比较麻烦,二来容易出错,所以我们可以把 π 做成宏定义来使用.   语法说明: (1)宏名一般用大写 (2)使用宏可提高程序的通用性

C语言中申明解析方法的总结

转载自:http://soft.chinabyte.com/database/248/12193748.shtml <C专家编程>第3章学习 C语言中的声明是一个比较令人头痛的问题,尤其一些复杂的声明看起来甚至会令人感到恐怖,如果您是一位初学者,您一定会对下面这几个式子感到畏惧.因为对于刚接触这种形式的人来说,这简直太复杂了,当然前提是假定您未掌握分析这方面的专业知识. 第一个声明: void(*signal(int sig, void (*func)(int)))(int);第二个声明:co