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

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 = 1;
    int b = 2;
    int c[4] = {0};
    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); // 3
    printf("s2 = %d\n", s2); // 5
    printf("m = %d\n", m); // 2
    printf("d = %d\n", d); // 4
    return 0;
}

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 = 0;
    int* p = MALLOC(int, 5); //以 int 类型作为参数!
    LOG("Begin to run main code...");FOREACH(x, 5)
    BEGIN
    p[x] = x;
   END
    FOREACH(x, 5)
    BEGIN
    printf("%d\n", p[x]);
    END
    FREE(p);
    LOG("End");
    return 0;
}
时间: 2024-10-20 03:07:18

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

Linux学习笔记——例说makefile 增加宏定义

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

黑马程序员------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语言学习笔记 (002) - C++中引用和指针的区别(转载)

下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图,所示指针的含义: 引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用.见下图,所示引用的含义: 2.指针和引用的区别 首先,引用不可以为空,但指针可以为空.前面也说过了引用是对象的别名,引用为空--对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化.因此

C语言学习笔记---001C语言的介绍,编译过程原理,工具等

技术qq交流群:Dream:251572072 ----------------------------------------------------------------------- a.C语言的历史 起源 标准化 b.基于c的语言 编程语言都借鉴了c语言的特性 c++语言:包含所有c语言特性,增加了类和其他的特性支持面向对象编程 java:基于C++的,包含了一些c的特性 C#:是由java和c++发展起来的 Perl:脚本语言 c.c语言特性: c语言是一种底层语言,为了适应系统编程

黑马程序员------C 语言学习笔记---C语言的基本结构

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 第一 C语言结构基础 1.1     C语言的基本结构 01          #include <stdio.h> :表示文件包含,功能是将头文件stdio.h中的内容包含到程序中. 02          mai

11-黑马程序员------C 语言学习笔记---C语言的变量的作用域和储存类型

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 五 变量的作用域和储存类型 01 变量的作用域是指该变量有效地区域,C语言中得变量分为局部变量和全局变量. 02 局部变量: *局部变量的作用域仅限于定义它的代码块内,离开代码块内便失去作用. *形参只有在函数内有效,其也属于局

09-黑马程序员------C 语言学习笔记--- C语言函数

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 一 函数定义 01 函数分为库函数和自定义函数两种 函数一般格式: 函数返回值类型 函数名(数据类型 参数1, 数据类型 参数2,……..) { 函数体: } *函数若不需要返回值类型,则用void表示 *函数的标志是括号,不管

12-黑马程序员------C 语言学习笔记--- C语言指针与函数

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 六 指针与函数 01 指针作为函数参数 指针作为实参时,与普通变量一样,也是采用单向的值传递方式,即将指针变量的值(该值是一个地址)传递给被调函数的形参(必须也是一个指针变量).由于形参接受实参传递的值是一个地址,这样两者就指向

13-黑马程序员------C 语言学习笔记--- C语言一维数组

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 四 简单构造数据类型 一 一维数组 01 一维数组的定义: 类型标识符 数组名[常量表达式]; 如:int a[10];其表示定义了一个名为a的整型数组,该数组共有10个元素,即10个整型变量,可以储存10个整型数据. 02 类