define与const关键字的多种用法

简介: define与const关键字的多种用法



define

在C语言中,#define 是一个预处理指令,用于创建宏定义(Macro Definition)。宏定义是一种文本替换机制,允许你在代码中使用标识符来代替一段文本。

const

在C++中,const 是一个关键字,用来修饰的内容不可变。

1. define

#define 的一般语法如下(了解即可):

1.定义常量

2.创建函数式宏

3.定义条件编译标志

4.字符串化宏

5.连接宏

1.1 定义常量

#define PI 3.14159265

这将创建一个名为 PI 的宏,它将在程序中代表 3.14159265。

1.2 创建函数式宏

#define SQUARE(x) ((x) * (x))

这将创建一个名为 SQUARE 的宏,它接受一个参数 x,并返回 x * x 的结果。比如可以在代码中使用 SQUARE(5) 来得到 5 的平方。

1.3 定义条件编译标志

#define DEBUG 1

这可以用于在编译时控制是否包含调试代码。例如可以在代码中使用 #ifdef DEBUG 来包含调试语句。

1.4 字符串化宏

#define STRINGIFY(x) #x

这将创建名为 STRINGIFY 的宏,可将标识符转换为字符串。例如STRINGIFY(Hello) 将被替换为 "Hello"。

1.5 连接宏

#define CONCAT(x, y) x##y

这将创建名为 CONCAT 的宏,可将两个标识符连接在一起。例如CONCAT(a, b) 将被替换为 ab。

2. const

以下是几种const关键字的用法:

1. 定义常变量

2. 定义常量指针

3. 用来指向常量的指针

4. 定义常量成员函数

5. 定义常量引用参数

6. 定义常量对象

2.1 定义常变量

#include <iostream>
using namespace std;
int main()
{
    const int Number=10; //定义常变量
    //Number=20;  使用此语句则报错:assignment of read-only variable 'Number'
    printf("%d\n",Number);  //输出10
    return 0;
}

在这个例子中,Number被声明为一个常变量,其值在声明后不可被修改。这可以用于创建不可变的数值或对象。


2.2 常量指针

int x = 5;
const int* ptr = &x;//*ptr 不变,ptr可变
*ptr = 6; //error
ptr=&b;   //ok
b=66;     //ok

这里,const int*表示指向整数的常量指针。通过这种方式声明的指针,不能用于修改指向的值,但可以指向不同的整数。


2.3 指针常量

string str="hello";
int* const ptr = str;//指针常量,*ptr可变,ptr不变
*ptr='a';   //ok
ptr=str2;   //error

在这个例子中,int* const表示一个指向整数的指针常量,指向的整数可以被修改,但指针本身不可被重新赋值。


2.4 常量指针常量

const int* const ptr;//*ptr与ptr都不可变
*ptr=5; //error
ptr=&a; //error

2.5 定义常量成员函数

class MyClass {
public:
    void SomeFunction() const {
        // 不能修改成员变量
    }
};

在类中,成员函数声明中的const关键字表示该函数是一个常量成员函数,它不能修改类的成员变量(除非它们声明为mutable)。


2.6 定义常量引用参数

void MyFunction(const int& value) {
    // 不能修改传入的参数
}

函数参数前的const关键字表示传入的参数是一个常量引用,函数内部不能修改这个参数的值。


2.7 定义常量对象

const MyClass obj;

在这个例子中,obj是一个常量对象,意味着它的成员变量只能在构造函数中初始化,不能在对象创建后被修改。

3. 易错

1. const和define的区别

#define PI 3.14           //符号常量
const float PI=3.14;      //常变量

const用于定义常量;而define用于定义宏,而宏也可以用于定义常量。都用于常量定义时,它们的区别有:

  1. const定义的常变量具有变量的基本属性,包括数据类型和存储单元,而#define无
  2. 有些编译器可以对const常变量进行调试,不能对宏调试
  3. 符号常量采用#define指令,属于预编译指令,在预编译后,符号常量就不存在了(比如符号常量PI全被置换成3.14)

那为什么有了const还需要#define呢?

       const无法代替宏作为卫哨来防止文件的重复包含

2. const int *a, int const *a, const int a, int *const a, const int *const a分别是什么,有什么特点

1. const int a;     //a是常量,值不允许修改。

2. int const *a(等价const int *a);  //a指针所指向的内存里的值不变,即(*a)不变,a可变

3. int *const a;    //a指针所指向的内存地址不变,即(*a)可变,a不变

4. const int *const a;   //都不变,即(*a)不变,a也不变

3. 简述常量指针和指针常量的区别

//const* 是常量指针,*const 是指针常量

int const *a;    //a指针所指向的内存里的值不变,即(*a)不变

int *const a;    //a指针所指向的内存地址不变,即a不变

目录
相关文章
|
1月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
30天前
|
C语言
typedef 和 # define 用法区别
typedef 和 # define 用法区别
19 0
|
1月前
#define定义常量和宏
#define定义常量和宏
13 0
|
7月前
#define的用法
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。 1. 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先 被替换。 2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。 3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。
51 0
|
4月前
|
编译器 C++
C++ 中 const 和 constexpr 关键字解析:常量、函数和指针
很多 C++ 的初学者看到 const 这个关键字的第一反应都是一头雾水,主要是因为 const可 以出现在很多的位置,以及后面加入的 constexpr 更是常常感到困惑,今天就为大家一一解释出现它们的含义和以及作用
103 0
|
9月前
|
C语言
C语言中的const,冒牌货常量
C语言中的const,冒牌货常量
41 0
|
7月前
|
编译器
#define 定义常量和宏
工作机理:直接替换,以下列代码为例编译器直接将用到max的地方替换为100
39 0
|
9月前
|
C语言
学C的第四天(各种操作符补充;简单了解多种关键字,define定义常量和宏,结构体)(1)
10.6:关系操作符: >:大于 >=:大于等于 <:小于 <=:小于等于 !=:用于测试“不相等” ==:用于测试“相等”
|
9月前
|
Java 编译器 C语言
学C的第四天(各种操作符补充;简单了解多种关键字,define定义常量和宏,结构体)(2)
[被static修饰的变量(静态变量)和全局变量的区别:都存放在静态区中,但静态变量的作用域还是在局部,全局变量的作用域是任意地方,两者生命周期相同,都是程序结束才销毁] 2.修饰全局变量 - 称为静态全局变量 (未使用static时:)
|
10月前
|
编译器 C++
C++11之常量表达式(const与constexpr的区别)
C++11之常量表达式(const与constexpr的区别)
106 0