c语言基础知识:#define与const、typedef的区别,一些其他预处理指令

本文详细介绍了C语言中#define、const以及typedef的区别。#define是预处理宏替换,不分配内存,而const变量在运行时分配内存。typedef则用于给类型创建别名。此外,还讨论了#undef、#line、#error和#warning等预处理指令,并解释了条件编译的概念和用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define与const的区别

定义内容不同

#define N 10       //称为明示常量   宏常量
const int n = 10;  //const定义的常量,其实不是真正的常量,const修饰的变量表示只读

int main(){
    int arr[N] = {};
    //int brr[n] = {};    //error
    int brr[n]; 
    static int crr[N];    
    static int drr[n];    //error
    const int x = 3*4*5;
    int a = 4,b = 5;
    const int y = a*b;
    return 0;
}
  • 编译器处理方式也不一样

    • 宏,是在预处理阶段进行替换

    • const变量是在编译或者运行时进行赋值or计算

  • 存储方式也不一样

    • 宏,不是为其分配内存的 ,在代码中使用宏的地方直接替换成值

      • 每使用一次宏,都是替换一次

    • const变量,在运行时一定会为其分配相应的内存空间

      • 每使用一次变量,都是从内存中加载一次该变量的数据

  • 执行效率也不一样

    • 宏直接替换之后,是用值代替了,不涉及到取值操作

    • const变量,在进行处理时,从内存中加载

#define 与 typedef的区别

typedef 给类型取别名

typedef unsigned long int size_t;  //size_t 就是 unsigned long int类型
#define size_t unsigned long int   //size_t 是新的标识符  使用size_t地方会被替换成unsigned long int


typedef int * TP;
#define DP int *

TP a,b;       //    TP ==  int *    a,b都是int*类型
DP m,n;       //    直接替换   int * m,n;      m是int*类型   n是int类型

unsigned DP p1;  //正确的   unsigned int * p1;
unsigned TP p2;  //错误的

#undef #line #error #warning

  • #undef 删除一个已经定义过的宏

  • #line指定行号

  • #error 预处理错误,直接中断

    #warning 预处理产生警告

条件编译

        条件编译,是指在编译预处理时,选择性的编译部分代码,满足条件的代码就编译,不满足条件的代码直接删除,与分支语句不同,分支语句中,每一个分支都能够确保会编译到可执行文件中,至于会不会执行,另说

if(1){
    printf("hello\n");
} else {
    printf("world!\n");      //这句代码永远也无法执行   但是它会编译到可执行文件中
}

        根据宏定义来判断

//如果宏已经定义过,则编译此部分代码
#ifdef  MACRO
     //这部分代码   MACRO宏如果定义了  会编译  否则删除
#endif 

//如果宏没有定义过,则编译此部分代码
#ifndef MACRO
	//MACRO这个宏如果没有定义则编译
#endif 

//二者中选其中一种方式就可以

        可以根据宏的值来进行条件编译,但只能是一些简单的条件判断(在预处理能够处理的)

#if MACRO == 1

#elif  MACRO == 2

#elif  MACRO == 3

[#else]

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值