关于C语言 const 和 define 区别

目录
  • 一.const 使用
    • 1.const 修饰变量
    • 2.const 修饰指针
    • 3.const 修饰在函数名前面当
    • 4.const 修饰在函数名后面
    • 5.const 修饰函数参数
  • 二.define 使用
    • 1.define 定义常量
    • 2.define 定义函数
    • 3.define 定义多行函数
    • 4.define 防止头文件重复包含
  • 三.const 和 define 区别
  • 四.const 优点

一.const 使用

const 是 constant 的缩写,“恒定不变”的意思。被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多 C++ 程序设计书籍建议:“Use const whenever you need”。

1.const 修饰变量

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 const 和 define 区别
//@Time:2021/07/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

#include <stdio.h>

int main() {
    const int a = 20 ;
    printf("a = %d\n",a);
    a = 200 ;
    printf("a = %d\n",a);
    return 0;
}

/*
 输出:

 Compilation Failed
 error: assignment of read-only variable 'a'
     6 |     a = 200 ;
       |     ~~^~~~~
 */

用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。并且 const 修饰的变量在定义的时候就给它赋初值,否则报错:

error: uninitialized 'const ' [-fpermissive]

详细解释可以直接跳转:const 修饰变量;

2.const 修饰指针

//以下两者等价,表示 *p 不可变。*p 表示的是指针变量 p 所指向的内存单元里面的内容,此时这个内容不可变;
const int *p
int const *p

//此时 const 修饰的是 p,所以 p 中存放的内存单元的地址不可变,而内存单元中的内容可变。即 p 的指向不可变,p 所指向的内存单元的内容可变;
int * const p

//*p 和 p 都被修饰了,那么 p 中存放的内存单元的地址和内存单元中的内容都不可变;
const int * const p

3.const 修饰在函数名前面当

const 在函数名前面的时候修饰的是函数返回值;在函数名后面表示是 C++ 常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作。

const char * GetString(void);
const int    GetInt(void);
const float  GetFloat(void);
const double GetDdouble(void);

如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加 const 修饰的同类型指针;

const char * GetString(void);

//如下语句将出现编译错误:
//char *str = GetString();

//正确的用法是
const char  *str = GetString();

如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加 const 修饰没有任何价值。

int GetInt(void);

const int GetInt(void);

以上两个函数都是都是独立存在的,并非同一个函数;

4.const 修饰在函数名后面

当 const 在函数名前面的时候修饰的是函数返回值;在函数名后面表示是 C++ 常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作。

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 const 和 define 区别
//@Time:2021/07/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

class People
{
 public:
    int talk(void);
    int eat(void) const; // const 成员函数
 private:
    int m_age;

};
int People::eat(void) const
{
    ++m_age; // 编译错误,企图修改数据成员m_num
    talk();  // 编译错误,企图调用非const函数
    return    m_age;
}
  • const 对象只能访问 const 成员函数,而非 const 对象可以访问任意的成员函数,包括 const 成员函数;
  • const 对象的成员是不可修改的,然而 const 对象通过指针维护的对象却是可以修改的;
  • const 成员函数不可以修改对象的数据,不管对象是否具有 const 性质.它在编译时,以是否修改成员数据为依据,进行检查;
  • 然而加上 mutable 修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的 const 成员函数是可以修改它的;

5.const 修饰函数参数

如果函数参数采用“指针传递”,那么加 const 修饰可以防止意外地改动该指针,起到保护作用。

void StringCopy (char*strDestination, const char *strSource);

其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。

如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加 const 修饰。

例如不要将函数 void Func1(int x) 写成 void Func1(const int x)。

如果参数作为输出参数,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加 const 修饰,否则该参数将失去输出功能(因为有 const 修饰之后,不能改变他的值)。

如果参数作为输入参数,可以防止数据被改变,起到保护作用,增加程序的健壮性;

二.define 使用

1.define 定义常量

C 语言中,可以用 #define 定义一个标识符来表示一个常量,用 #define 定义标识符的一般形式为:

#define  标识符  常量   //注意define最后没有分号
//例如:
#define MAX_VALUE 100       //定义整型变量MAX_VALUE值为100
#define USER_NAME "huge"    //定义字符串变量USER_NAME值为"huge"
#define PI 3.1415926        //定义浮点数变量PI值为3.1415926

凡是以 # 开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。

2.define 定义函数

//定义常量
#define MAX_VALUE 100       //定义整型变量MAX_VALUE值为100
#define USER_NAME "huge"    //定义字符串变量USER_NAME值为"huge"
#define PI 3.1415926        //定义浮点数变量PI值为3.1415926

//定义函数
#define MAX(a,b) (a>b)?a:b  //取两个数最大值
#define MIN(a,b) (a<b)?a:b  //取两个数最小值

3.define 定义多行函数

//定义常量
#define MAX_VALUE 100       //定义整型变量MAX_VALUE值为100
#define USER_NAME "huge"    //定义字符串变量USER_NAME值为"huge"
#define PI 3.1415926        //定义浮点数变量PI值为3.1415926

//定义简单函数
#define MAX(a,b) (a>b)?a:b  //取两个数最大值
#define MIN(a,b) (a<b)?a:b  //取两个数最小值

//定义复杂多行的函数
#define   MACRO(arg1,   arg2)   do   {   \
   \
stmt1;   \
stmt2;   \
   \
}   while(0)

//关键是要在每一个换行的时候加上一个 "\ "

使用define定义一个多行的复杂函数,关键是要在每一个换行的时候加上一个 \;

4.define 防止头文件重复包含

通过 #ifndef / #define 解决头文件重复包含

#ifndef __XXX_H__
#define __XXX_H__

int a=1;

#endif

上面的伪代码如下:

如果(没有定义宏__XXX_H__)
{
    那么直接定义宏__XXX_H__
    定义变量a 并且赋值为 1
}
结束程序

  • 假如第一次包含时,由于没有定义宏 __XXX_H,所以做了两件事,定义宏 __XXX_H,然后定义 int a = 1;
  • 假如第二次包含时,由于已经定义宏 __XXX_H__,所以啥都不做;
  • 假如第 N 次包含时,由于已经定义宏 __XXX_H__,所以啥都不做;
  • 整个过程,无论头文件被包含多少次,变量 a 只被定义一次,不会有重复包含重复定义的问题存在!

三.const 和 define 区别

1.就起作用的阶段而言
define 是在编译的预处理阶段起作用,而 const 是在 编译、运行的时候起作用。
2.就起作用的方式而言
define 只是简单的字符串替换,没有类型检查。而 const 有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
3.就存储方式而言
define 只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份; const 定义的只读变量在程序运行过程中只有一份备份。
4.从代码调试的方便程度而言
const 常量可以进行调试的,define 是不能进行调试的,因为在预编译阶段就已经替换掉了。

5.从效率程度而言

编译器通常不为普通 const 常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高

四.const 优点

  • 1.const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
  • 2.有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
  • 3.const 可节省空间,避免不必要的内存分配,提高效率

到此这篇关于关于C语言 const 和 define 区别的文章就介绍到这了,更多相关C语言 const 和 define 区别 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言关键字const和指针的结合使用

    我们先定义三个变量 1.const int *p1 2.int const *p2 3.int *const p3 p1.p2.p3这三个指针都是指向int类型的,那它们有什么区别呢 写个代码测试一下 编译一下 可看到第11,12,16行报错,从中可得出以下结论: const int * 与 int const *是一样的效果,指向的内存是不能改变的,即指针指向的内容是只读的,或者说是一个常量.不过指向的位置是可以更改的,即p1和p2可以重新指向别的常量. 而char *const 刚好相反,表

  • C语言入门篇--四大常量(字面,const修饰,宏,枚举)及标识符

    目录 1.字面常量 2.const修饰的常变量 3.#define定义的标识符常量 3.1标识符 3.2宏常量 4.枚举常量 1.字面常量 (1)字面意思是啥就是啥,看其表示就可以知道其值和类型. (2)有值无名,一用来初始化变量,与一种字符相关联. #include <stdio.h> int main() { 10;//int型数字10 'c';//char型字符c "Hello world!";//字符串常量(!C语言无字符串类型) int sum=10+20;//1

  • C语言中const和C++中的const 区别详解

    C语言中const和C++中的const 区别详解 C++的const和C语言的#define都可以用来定义常量,二者是有区别的,const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查. 而C语言中的const与C++也有很大的不同,在C语言中用const修饰的变量仍是一个变量,表示这个变量是只读的,不可显示地更改,而在C++中用const修饰过后,就变成常量了.例如下面的代码: const int n=10; int a[n];

  • C语言中的const如何保证变量不被修改

    这小段文章要理清楚的是,在C语言中,const是如何保证变量不被修改的? 我们可以想到两种方式: 第一种,由编译器来阻止修改const变量的语句,让这种程序不能通过编译: 第二种,由操作系统来阻止,即把const 的内存地址访问权限标记为"只读",一旦运行中的程序试图修改它,就会产生异常,终止进程. 上面想到的这两种方式,都能达到让某一变量的值不被修改的目的,那么究竟是哪一种呢?我们写两个例子来看一看. 先来看一个简单的例子,源文件const.c: #include <stdio

  • 从C语言过渡到C++之const

    1. 定义常量 1.1 C语言中定义常量的方法 在C语言从零开始这个系列中,我们讲了C语言定义常量的方法.没有看过的同学请参考:C语言从零开始(五)-常量&变量 为什么要定义常量我就不再赘述了,这里重点说说这么定义有什么不好.经常有这样的面试题:请写出下面这段代码的执行结果: #include <stdio.h> #define SUM 5 + 1; void main() { int a = 2 * SUM; printf("%d", a); } 经常有人答12,

  • 关于C语言 const 和 define 区别

    目录 一.const 使用 1.const 修饰变量 2.const 修饰指针 3.const 修饰在函数名前面当 4.const 修饰在函数名后面 5.const 修饰函数参数 二.define 使用 1.define 定义常量 2.define 定义函数 3.define 定义多行函数 4.define 防止头文件重复包含 三.const 和 define 区别 四.const 优点 一.const 使用 const 是 constant 的缩写,"恒定不变"的意思.被 const

  • C语言编程技巧 关于const和#define的区别心得

    #define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中.如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO.如果ASPECT_RATIO不是在你自己写的头文件中定义的,你就会奇怪1.653是从哪里来的,甚至会花时间跟踪下去.这个问题也会出现在符号调试器中,因为同样地,你所写的符号名不

  • C语言在头文件中定义const变量详解

    C语言在头文件中定义const变量详解 在头文件中定义const不会有多变量的警告或错误,如果该头文件被大量包含会造成rom空间的浪费. 通过查看*.i文件的展开呢,可以发现每个.i文件都会有相应的变量展开. 查看*.map文件,能查看到该变量的多个地址分配. 在预编译的时候如果在头文件定义了const变量,每一个包含该头文件的c文件都会将其展开,而在编译的时候不会报错,因为这符合语法规则,每一个包含这个头文件的*.c文件都会编译一次这个变量,分配一个新的地址,然后在链接的时候也不会报错,因为每

  • C语言中const与指针使用方法总结

    C语言中const与指针使用方法总结 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 总结: * const 值不能改变,指向可改变 const * 值能改变,指向不可改变 const * const 都不能改变 实例代码: #include <stdio.h> int main(int argc, const char * argv[]) { // 1 可改

  • C语言中const和define的区别你了解嘛

    目录 define和const使用 const和define区别 总结 define和const使用 const和define区别 #include <stdio.h> #define A 1 #define B (A+3) // #define C A/B*3 // //const不能重定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义 const double PI=3.14; //const double PI=3.145; #define PI2 3

  • C语言中typedef的用法以及#define区别详解

    目录 1.简洁定义 2.为已有类型起别名 为字符数组起别名 为指针起别名 3.typedef 和 #define 的区别 总结 1.简洁定义 C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样.而编程中起别名,是为了编程人员编程方便,例如: 定义如下结构体 struct stu { int ID; char name[20]; float score[3]; char *data; }; 要想定义一个结构体变量就得这样写: struct stu Marry://Marry是

  • 解析php中static,const与define的使用区别

    define部分:宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.)宏的语法为:#define 宏名称 宏值作为一种建议和一种广大程序员共同的习惯,宏名称经常使用全部大写的字母.利用宏的优点:1)让代码更简洁明了当然,这有赖于你为宏取一个适当的名字.一般来说,宏的名字更要注重有明确直观的意义,有时宁可让它长点.2)方便代码维护对宏的处理,在编译过程中称为"预处理".也就是说在正式编译前,编译器必须先将代码出现的宏,用

  • C语言 strcpy和memcpy区别详细介绍

    C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识. 1.strcpy和strncpy函数 这个不陌生,大一学C语言讲过,其一般形式为strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去. EX: char str1[10]='',str2[]={"China"}; strcpy(str1,str2); strn

  • C++中const与#define的利弊分析

    C++中const与#define的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换: 用const float MAX = 255; 定义的常量有类型名字,存放在内存的静态区域中,在程序运行过程中const变量只有一个拷贝,而#define 所定义的宏变量却有多个拷贝,所以宏定义在程序运行过程中所消耗的内存

  • 详解微信小程序中var、let、const用法与区别

    微信小程序可以使用Javascript的最新ES6标准来开发所以微信小程序中var.let.const用法与区别可以视为Javascript ES6标准中var.let.const用法与区别 let命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 上面代码在代码块之中,分

  • 关于C语言strlen与sizeof区别详情

    目录 一.sizeof详解 1.sizeof()作用 2.sizeof 3.sizeof () 4.sizeof()与数组名的关系 5.sizeof()返回类型造成的坑 二.strlen详解 三.strlen与sizeof的区别 strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符).strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'

  • 深入浅析C语言与C++的区别与联系

    目录 一.C语言是面向过程语言,而C++是面向对象语言 1.面向过程和面向对象的区别 2.面向过程和面向对象的优缺点 面向过程语言 面向对象语言 二.具体语言上的区别 1.关键字的不同 2.后缀名不同 3.返回值 4.参数列表 5.缺省参数 半缺省参数 全缺省参数 6.函数重载 7.const 总结 8.引用 9.malloc,free && new,delete 10.作用域 C语言虽说经常和C++在一起被大家提起,但可千万不要以为它们是一种编程语言.我们来介绍C语言和C++中的区别和联

  • C语言const关键字的用法详解

    目录 1 介绍 1.1 const修饰变量 1.2 const修饰数组 1.3 const修饰指针 1.4 const修饰函数参数 2 const对程序的影响 3 总结 1 介绍 const关键字是constant的缩写,翻译为常量.常数.在C语言中const的作用很强大,它可以修饰变量.数组.指针.函数参数等. 1.1 const修饰变量 const修饰变量,表示希望此变量具有只读性,防止被直接直接修改. //const关键字是constant的缩写,翻译为常量.常数. //在C语言中cons

随机推荐