define与const关键字的多种用法

2024-02-20 13:07:04 浏览数 (1)

define

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

const

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

1. define

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

1.定义常量 2.创建函数式宏 3.定义条件编译标志 4.字符串化宏 5.连接宏

1.1 定义常量

代码语言:javascript复制
#define PI 3.14159265

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

1.2 创建函数式宏

代码语言:javascript复制
#define SQUARE(x) ((x) * (x))

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

1.3 定义条件编译标志

代码语言:javascript复制
#define DEBUG 1

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

1.4 字符串化宏

代码语言:javascript复制
#define STRINGIFY(x) #x

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

1.5 连接宏

代码语言:javascript复制
#define CONCAT(x, y) x##y

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

2. const

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

1. 定义常变量 2. 定义常量指针 3. 用来指向常量的指针 4. 定义常量成员函数 5. 定义常量引用参数 6. 定义常量对象

2.1 定义常变量

代码语言:javascript复制
#include <iostream>
using namespace std;

int main()
{
    const int Number=10; //定义常变量
    //Number=20;  使用此语句则报错:assignment of read-only variable 'Number'
    printf("%dn",Number);  //输出10

    return 0;
}

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


2.2 常量指针

代码语言:javascript复制
int x = 5;
const int* ptr = &x;//*ptr 不变,ptr可变

*ptr = 6; //error
ptr=&b;   //ok
b=66;     //ok

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


2.3 指针常量

代码语言:javascript复制
string str="hello";
int* const ptr = str;//指针常量,*ptr可变,ptr不变

*ptr='a';   //ok
ptr=str2;   //error

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


2.4 常量指针常量

代码语言:javascript复制
const int* const ptr;//*ptr与ptr都不可变

*ptr=5; //error
ptr=&a; //error

2.5 定义常量成员函数

代码语言:javascript复制
class MyClass {
public:
    void SomeFunction() const {
        // 不能修改成员变量
    }
};

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


2.6 定义常量引用参数

代码语言:javascript复制
void MyFunction(const int& value) {
    // 不能修改传入的参数
}

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


2.7 定义常量对象

代码语言:javascript复制
const MyClass obj;

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

3. 易错

1. const和define的区别

代码语言:javascript复制
#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不变

0 人点赞