wwppd 发表于 2023-12-17 21:48

宏定义和const关键字定义

常量
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。

常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。

常量就像是常规的变量,只不过常量的值在定义后不能进行修改。

常用的一些常量表示,如:

名称        值        含义
PI        3.14159 265        表示 π ππ 的值为常量
e        2.71828        自然底数 e ee 的值
N        一个自然数        可以用来定义数组长度
exp        1e-6        一般表示循环的终止条件 10 1010− 6 -6−6
在 C语言 中,有两种简单的定义常量的方式:
使用 #define 预处理器。
使用 const 关键字。
1. 使用关键字( const )
声明格式:
const type variable = value;

案例:常量定义数组的长度
const int N=10;
int a;

注意点 (说明)
①:语句 const int N=10;也可以写成 int const N=10; 但是我个人推荐使用前一种表达方式。
2. 宏定义( define )
#include<stdio.h>

#define PI 3.1415926f //注意:不能以分号(;)结尾

int main(){
        printf("%f",PI);
        return 0;
}

注意点 (说明)
①:该定义不能以分号结尾;否则报错;
②:#define没有数据类型,只是单纯的替换
③:define可以带参数进行宏的定义,如下代码:
#include<stdio.h>

//注意:带参数的宏定义
#define SUM(a,b) a+b
#define MAX(a,b) a>b?a:b

int main(){
        int result=SUM(6,7);
        printf("%d\n",result);//result=13

        result=MAX(3,9);
        printf("%d\n",result);//result=9

        result=MAX(16,14);
        printf("%d\n",result);//result=16

        return 0;
}

易错点 (说明)
正如上述第二点所说:#define没有数据类型,只是单纯的替换
所以思考以下代码的值:
#include<stdio.h>
#define SUM(a,b) a+b

int main(){
       
        int result=SUM(2,2)*SUM(3,4);
        printf("%d\n",result);//result=12
        return 0;
}

您可能会怀疑这个值不是12,因为( 2 + 2 ) ∗ ( 3 + 4 ) = 28 ≠ 12 (2+2)* (3+4)= 28 ≠12(2+2)∗(3+4)=28
̸
​       
=12,但事实确是12。
原因就在于define定义的内容只会是单纯的替换,上述表达式实际上是 2 + 2 ∗ 3 + 4 = 2 + 6 + 4 = 12 2+2*3+4=2+6+4=122+2∗3+4=2+6+4=12。

两种方式的比较:
1.宏定义是在编译之前进行的,而const是在编译阶段处理的
2.宏定义不占用内存单元,而const定义的常量占用内存单元
3.宏定义没有具体的数据类型,而const有具体的数据类型
4.宏定义可以带参数进行定义,而const不能带参数定义
来自:https://blog.csdn.net/qq_42887760/article/details/85125180

tpgf 发表于 2024-1-3 16:51

宏定义和const关键字有没有使用的交集啊

qcliu 发表于 2024-1-3 21:59

const关键字是不是一般来说不能使用很多啊

drer 发表于 2024-1-4 10:33

可以在头文件里边定义const变量吗

coshi 发表于 2024-1-4 11:46

宏定义和const感觉从效率上讲宏定义更高级

mollylawrence 发表于 2024-1-4 11:57

#define和const都是用来定义常量的,但它们的使用方式和作用有所不同。

kkzz 发表于 2024-1-4 12:09

因为是文本替换,如果宏名不小心替换到了不应该替换的地方,可能会引发意料之外的问题

dspmana 发表于 2024-1-4 13:23

使用const关键字定义的变量是一个常量,它的值在编译时或运行时可以确定,但不能在程序运行过程中修改。

burgessmaggie 发表于 2024-1-4 16:18

在C或C++等编程语言中,宏定义(Macro Definition)和const关键字定义常量(Constant)是两种不同的概念,用于定义在程序中不应改变的值。

jackcat 发表于 2024-1-4 16:48

宏定义常用于定义简单的字符串或代码片段,如函数、对象等的宏表示,或者进行条件编译等。

mattlincoln 发表于 2024-1-4 17:19

宏定义在整个文件内及所有包含该宏定义头文件的文件中都是可见的,除非有相应的 #undef 操作取消定义。

averyleigh 发表于 2024-1-4 17:48

const关键字定义适用于需要类型安全、运行时内存分配的场景,而宏定义则适用于简单、快速定义常量的场景。

mikewalpole 发表于 2024-1-4 18:21

const定义的常量在编译时就会分配存储空间,这意味着它们在内存中有实际的位置。相比之下,宏定义的常量只是在文本层面进行替换,不会在内存中分配实际的空间。

wiba 发表于 2024-1-4 23:20

既然都是定义常量的 为什么会有这两种不同的方式呢

kxsi 发表于 2024-1-4 23:54

这两个的使用场合有什么不一样的吗

zerorobert 发表于 2024-1-5 09:13

首先,宏定义是由预处理器在预处理阶段处理的,它只是简单的文本替换,没有数据类型,因此不能进行安全检查。而const关键字则是在编译器编译阶段进行处理的,具有明确的数据类型,可以进行类型检查和作用域检查。

pmp 发表于 2024-1-5 09:31

const关键字定义的作用域与普通变量相同,分为全局作用域和局部作用域。

sdCAD 发表于 2024-1-5 09:53

宏定义和const关键字定义都可以实现常量的功能,但它们在类型检查、命名空间和编译过程中的处理方式上有所不同。

beacherblack 发表于 2024-1-5 10:12

宏定义在定义后不能再被修改。但是,由于宏定义在预编译阶段被替换,因此在某些情况下可以实现修改

i1mcu 发表于 2024-1-5 10:30

const定义的常量在编译时分配内存,并且只在程序中存在一份拷贝,即使它在多个地方被使用。
页: [1] 2 3 4
查看完整版本: 宏定义和const关键字定义