C语言学习笔记(八) -宏定义 Macro Definition

预处理命令与符号

/*
  预处理命令:以#号开头,只做文本替换,不做语法判断
            不是c语句,不需要在行末加‘;’,符号名要使用大写
  预定义符号:__FILE__ ;__LINE__ ;__DATE__ ;__TIME__
  宏定义:#difine 符号名 表达式
         #undef 符号名     //终止之前定义宏
 符号常量的定义:

*/


#include <stdio.h>
#define NAME name
#define LEN 20
int main(void)
{
    //printf("%s",__FILE__);

    char name[LEN]="hello";
    printf("%s\n",name);

    for (int i=0; i<LEN; i++) {
        putchar(name[i]);
    }
#undef LEN   //终止之前定义宏
#define LEN 20
    int arr[20]={1,2,3,4};

    return 0;
}
#undef LEN;


带参宏

/*
 带参宏:使用宏定义模拟函数
 #define 宏名(参数表)字符串
 在宏定义的所有参数都使用“()”,宏定义的整体也使用“()”;
 优点:能够使代码清晰,没有现场保护,没有函数调用过程
 缺点:只适用于比较简短的代码,不要使用宏替换递归调用函数
*/


#include <stdio.h>
#define swap(a,b) {int t=0;t=a;a=b;b=t;}
int main(void)
{
    int a=4,b=5;
    printf("%d %d\n",a,b);
    swap(a,b);
    printf("%d %d\n",a,b);
    return 0;
}



//输入两个值,输出两个值的和

#include <stdio.h>
#define SUM(A,B) ((A)+(B))
#define MIN(A,B) ((A)<(B)?(A):(B))



int min(int a,int b)
{
    return a<b?a:b;
}

int main(void)
{
    int sum,a=4,b=5;
    printf("%d %d\n",a,b);
    int c=SUM(a,b);
    printf("sum=%d\n",c);
    printf("Macro min: %d\n",MIN(a,b=3)); //先替换在执行
    printf("Fun min:%d\n",min(a,b=3)); //先求值后调用

    return 0;
}

使用命令行定义宏

/*
 使用命令行定义宏
  -Dname
  -Dname=value
  gcc -DLEN=10 demo058.c 指定宏定义LEN的值

 */

#include <stdio.h>



int main(void)
{

    int a[LEN];
    printf("%d\n",LEN);
    return 0;
}


条件编译

/*

 预处理时根据条件加载部分代码
 条件编译
 #if 条件1
 #elif 条件2
 #elif 条件3else
 #endif
 1. #ifdef 宏名
 .........
 #else
 .........
 #endif
 2.#ifndef 宏名
 .........
 #endif
 //处理重复包含问题

 */

/*
#include <stdio.h>
//#define DEF 0
int main(void)
{
#if DEF
    printf("条件编译\n");
#else
    printf("else\n");
#endif
    return 0;
}
*/

//若有宏定义circle,求圆面积,若没有定义,求正方形的面积
#include <stdio.h>
int main(void)
{
    int r=1;
#if CIRCLE
#define PI 3.14
    double s=PI*r*r;
#else
    double s=r*r;
    printf("%f\n",s);
    return 0;
}

标准函数库与本地文件包含

/*
 #include <stdio.h>  //标准函数库文件包含(gcc编译器默认的查找路径,PATH)
 #include"path"  //本地文件包含(gcc编译器首先在当前指定目录path下查找,若没有找到继续到PATH中查找)

 */

#include "demo060.h"

int main(void)
{
    int a[10];
    input(a,10);
    output(a,10);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值