1. C 语言中的宏定义

(1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不
(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)
(3)#define 定义之后的代码都可以使用这个宏

2. 定义宏常量

(1)#define 定义的宏常量可以直接使用
(2)#define 定义的宏常量本质为字面量

3. 宏定义表达式

(1)#define 表达式的使用类似函数调用
(2)#define 表达式可以比函数更强大
(3)#define 表达式比函数更容易出错

#include <stdio.h>
#define _SUM_(a, b) (a) + (b)
#define _MIN_(a, b) ((a) < (b) ? (a) : (b))
#define _DIM_(a) sizeof(a)/sizeof(*a)
int main()
{
int a = ;
int b = ;
int c[] = {};
int s1 = _SUM_(a, b); //(a)+(b)
int s2 = _SUM_(a, b) * _SUM_(a, b); //(a)+(b)*(a)+(b)
int m = _MIN_(a++, b); //((a++)<(b)?(a++):(b))
int d = _DIM_(c); //sizeof(c)/sizeof(*c);
printf("s1 = %d\n", s1); //
printf("s2 = %d\n", s2); //
printf("m = %d\n", m); //
printf("d = %d\n", d); //
return ;
}

4. 宏表达式与函数的对比

(1)宏表达式被预处理器处理,编译器不知道宏表达式的存在
(2)宏表达式用“实参”完全替代形参,不进行任何运算。

(3)宏表达式没有任何的“调用”开销

(4)宏表达式中不能出现递归定义。

内置宏

#include <stdio.h>
#include <malloc.h>
#define MALLOC(type, x) (type*)malloc(sizeof(type)*x)
#define FREE(p) (free(p), p=NULL)
#define LOG(s) printf("[%s] {%s:%d} %s \n", __DATE__, __FILE__,__LINE__, s)
#define FOREACH(i, m) for(i=0; i<m; i++)
#define BEGIN {
#define END }
int main()
{
int x = ;
int* p = MALLOC(int, ); //以 int 类型作为参数!
LOG("Begin to run main code...");FOREACH(x, )
BEGIN
p[x] = x;
END
FOREACH(x, )
BEGIN
printf("%d\n", p[x]);
END
FREE(p);
LOG("End");
return ;
}

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

C语言学习笔记--C语言中的宏定义的更多相关文章

  1. 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项

    博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...

  2. C语言学习笔记 (002) - C++中引用和指针的区别(转载)

    下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图 ...

  3. C语言学习笔记--C语言中变量的属性关键字

    变量属性关键字的使用语法:property type var_name; 1.auto 关键字 auto关键字是C语言中局部变量的默认的关键字,C编译器默认所有的局部变量都是auto的,它表明了被修饰 ...

  4. C语言学习笔记--C语言中的逗号表达式

    逗号表达式:exp1,exp2,epx3,...,expN; (1)逗号表达式是 C 语言中的“粘贴剂” (2)逗号表达式用于将多个子表达式连接为一个表达式 (3)逗号表达式的值为最后一个子表达式的值 ...

  5. Go语言学习笔记——Go语言数据类型

    布尔型 布尔型的值只可以是常量 true 或者 false.一个简单的例子:var b bool = true. 数字类型 整型 int 和浮点型 float32.float64,Go 语言支持整型和 ...

  6. Go语言学习笔记——Go语言的make的理解

    实例:https://tour.go-zh.org/moretypes/10 谢大<Go Web编程>书中的讲解https://github.com/astaxie/build-web-a ...

  7. Go语言学习笔记——Go语言的指针

    Go具有指针.指针保存了变量的内存地址. 类型*T是指向类型T的值得指针.其零值是nil var p *int &符号会生成一个指向其作用对象的指针 i:=42 P=&i *符号表示指 ...

  8. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  9. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

随机推荐

  1. Java读取lob格式数据

    想要读出lob里面的图片数据,就要确认clob里面存储的是什么,一般情况下存储的base64的串串.所以就以base64为例,而Blob里面存储的大部分是图片数据,但也有xml内容数据. 1查询lob ...

  2. mysql数据简单去重

    我有一个 foo 表,定义了如下几个字段:id / a / b,其中 id 是主键,a,b 原本应该具有唯一性, 但因为程序 bug 导致 a,b 内容有重复,现在我要在 a,b 上加唯一索引,请问如 ...

  3. 运行php的时候出现计算机中丢失 MSVCR110.dll怎么解决

    运行php的时候出现计算机中丢失 MSVCR110.dll怎么解决 一.总结 一句话总结:因为现在php所有的 5.5 环境都是基于 vc11 的编译脚本下生成的,所以在 windows 下你得安装相 ...

  4. ubuntu更改启动顺序

    在ubuntu中修改启动配置. 启动相关grub2主要包含下面三个文件:1.   /boot/grub/grub.cfg 文件    2.   /etc/grub.d/ 文件夹   3.   /etc ...

  5. 分享知识-快乐自己:HttpClient 访问 WebService 开放接口

    HttpClient: 场景需求如下: 1.项目中需要与一个基于HTTP协议的第三方的接口进行对接 2.项目中需要动态的调用WebService服务(不生成本地源码) 3.项目中需要利用其它网站的相关 ...

  6. 《Advanced Bash-scripting Guide》学习(十八):[[ ]]与[ ]的一些特殊情况

    本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 例1: [ -eq ] && [ -n "`echo ...

  7. count(*) 和count(1) 有区别吗

    create table test1 (a varchar2(2),b varchar2(2)); insert into test1 values ('b','c'); insert into te ...

  8. vue mint ui 手册文档对于墙的恐惧

    http://www.cnblogs.com/smallteeth/p/6901610.html npm 安装 推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用. npm ...

  9. Dev c++在新建文件中插入文件头

    在菜单栏中依次点击Tools->Editor Options->Snippets->Default Source 勾选Insert the following code into e ...

  10. BEC translation exercise 7

    在挑选时我们完全出自疏忽而漏过了这篇短文.In making the selection we passed this short piece by quite inadvertently. we l ...