首页 > 编程语言 >深入理解C++中的常量和宏:const、#define、typedef和inline详解

深入理解C++中的常量和宏:const、#define、typedef和inline详解

时间:2024-06-11 12:59:14浏览次数:23  
标签:typedef const 定义 int C++ 类型 define

一、const 与 #define 的区别

1. 定义方式和类型
  • const 定义的常量是有类型的变量。
  • #define 只是文本替换,不带类型。
const int MAX_VALUE = 100;  // MAX_VALUE 是一个整数类型的常量
#define MAX_VALUE 100       // MAX_VALUE 是一个文本替换,它不关联任何类型
2. 生效阶段
  • const 在编译和链接阶段起作用。
  • #define 只在预处理阶段起作用,进行文本替换。
const int LENGTH = 10;      // 只在编译时起作用
#define LENGTH 10           // 在预处理阶段替换
3. 类型检查
  • const 进行类型检查,能避免一些低级错误。
  • #define 没有类型检查。
const int WIDTH = 100;
#define WIDTH "100"        // 没有类型检查,可能引发错误

int array[WIDTH];          // 使用 const 时是正确的,有类型检查
int array[WIDTH];          // 使用宏定义,可能导致错误,因为没有类型检查
4. 空间占用
  • const 常量占用数据段空间。
  • #define 预处理后占用代码段空间。
const int HEIGHT = 10;    // 数据段中的常量
#define HEIGHT 10         // 预处理后替换为 10,占用代码段空间
5. 重定义
  • const 常量不能被重定义。
  • #define 可以使用 #undef 取消定义后再重定义。
const int PI = 3.14;      // 不能重定义
#define PI 3.14
#undef PI                 // 取消定义
#define PI 3.1416         // 可以重定义
6. 独特功能
  • #define 可以用来防止文件重复引用。
// 防止头文件重复引用
#ifndef MY_HEADER_H
#define MY_HEADER_H

// 头文件内容

#endif // MY_HEADER_H

二、#define 和别名 typedef 的区别

1. 执行时间
  • typedef 在编译阶段有效,进行类型检查。
  • #define 是宏定义,发生在预处理阶段,不进行类型检查。
typedef unsigned int UINT;  // 编译阶段有效,有类型检查
#define UINT unsigned int  // 预处理阶段,文本替换,没有类型检查
2. 功能差异
  • typedef 用来定义类型的别名。
  • #define 不仅可以为类型取别名,还可以定义常量、变量、编译开关等。
typedef int INTEGER;       // 定义类型别名
#define PI 3.14            // 定义常量
#define DEBUG              // 定义编译开关
3. 作用域
  • typedef 有自己的作用域。
  • #define 没有作用域限制。
typedef int Age;  // 仅在当前作用域有效

#define SIZE 100  // 在所有后续代码中有效,直到取消定义

三、#define 和 inline 的区别

1. 定义方式
  • #define 是宏定义。
  • inline 是内联函数。
#define MAX(a, b) ((a) > (b) ? (a) : (b))  // 宏定义
inline int max(int a, int b) {             // 内联函数
    return a > b ? a : b;
}
2. 替换阶段
  • 宏定义在预处理阶段进行文本替换。
  • 内联函数在编译阶段进行替换。
#define SQUARE(x) ((x) * (x))  // 预处理阶段替换
inline int square(int x) {     // 编译阶段替换
    return x * x;
}
3. 类型检查
  • 内联函数有类型检查,相比宏定义更安全。
#define SUM(a, b) ((a) + (b))   // 没有类型检查,可能有错误
inline int sum(int a, int b) {  // 类型检查,比较安全
    return a + b;
}

代码示例

下面的代码示例展示了 const#definetypedefinline 的使用方法和区别:

#include <iostream>
#include <cmath>  // 包含 std::fabs 函数

// #define 示例
#define PI 3.14159
#define SQUARE(x) ((x) * (x))

// const 示例
const int MAX_SIZE = 100;

// typedef 示例
typedef unsigned int uint;
typedef struct {
    int x;
    int y;
} Point;

// inline 函数示例
inline int max(int a, int b) {
    return (a > b) ? a : b;
}

int main() {
    // 使用 const
    const double radius = 5.0;
    double circumference = 2 * PI * radius;
    std::cout << "Circumference: " << circumference << std::endl;

    // 使用 #define 宏
    int side = 4;
    std::cout << "Square of side: " << SQUARE(side) << std::endl;

    // 使用 typedef
    uint age = 25;
    Point pt = {10, 20};

    std::cout << "Age: " << age << std::endl;
    std::cout << "Point: (" << pt.x << ", " << pt.y << ")" << std::endl;

    // 使用 inline 函数
    int a = 10, b = 20;
    std::cout << "Max value: " << max(a, b) << std::endl;

    return 0;
}

上述代码展示了 const#definetypedef 和 inline 的基本用法和它们的区别,有助于更清晰地理解它们在 C++ 编程中的角色和用途。

标签:typedef,const,定义,int,C++,类型,define
From: https://blog.csdn.net/m0_72877724/article/details/139596046

相关文章

  • acwing 653 钞票(c++)
    题目描述:在这个问题中,你需要读取一个整数值并将其分解为多张钞票的和,每种面值的钞票可以使用多张,并要求所用的钞票数量尽可能少。请你输出读取值和钞票清单。钞票的可能面值有100,50,20,10,5,2,1。经过实验证明:在本题中,优先使用面额大的钞票可以保证所用的钞票总数量最......
  • c/c++ 设计模式-----职责链(Chain Of Responsibility)模式
    一个关于涨薪审批的范例#include<iostream>#ifdef_DEBUG//只在Debug(调试)模式下#ifndefDEBUG_NEW#defineDEBUG_NEWnew(_NORMAL_BLOCK,__FILE__,__LINE__)//重新定义new运算符#definenewDEBUG_NEW#endif#endif//#include<boost/type_index.hpp>usingnames......
  • c/c++设计模式---策略模式
    一个具体范例的逐步重构Fighter.h#ifndef__RIGHTER__#define__RIGHTER__////增加补充生命值道具(药品)//enumItemAddlife//{//LF_BXD,//补血丹//LF_DHD,//大还丹//LF_SHD,//守护丹//};classItemStrategy;//类前向声明//战斗者父类class......
  • c/c++设计模式---状态模式
    一个基本的状态转换范例monster.h#ifndef_MONSTER__#define_MONSTER__classMonsterStatus;//类前向声明//怪物类classMonster{public:Monster(intlife);~Monster();public:intGetLife()//获取怪物血量{returnm_life;}......
  • C++11 运算符的优先级分组和结合性
    本文汇总了C++11中的运算符的含义、优先级分组及其结合性。如果两个运算符用于同一个操作数,首先应用优先极高的。如果两个运算符优先级相同,按结合性规则决定应用那个运算符。同一组中的运算符优先级和结合性相同,无论先左后右(L-R),还是先右后左(R-L)。运算符含义优先级分组......
  • C++进阶教程
    一、引言C++是一种高效、强大且灵活的编程语言,广泛应用于系统软件开发、游戏开发、科学计算等领域。对于已经掌握C++基础知识的开发者来说,进阶学习C++将帮助他们更深入地理解这门语言,并提升编程能力。本教程将介绍C++中的一些高级特性和技术,包括面向对象编程、模板编程、ST......
  • OpenCV实战案例——校正+切边[C++]
    0.前言本文以实战案例为背景,讲述如何使用计算机图形学知识完成需求,实现最终效果。本文包含实战案例素材以及过程代码讲解,方便读者理解。1.案例需求某公司打算开发一款用于提取学生作业本的程序,学生用手机拍摄自己的作业上传到程序,程序进行处理最终提取出作业本区域方便老师批改......
  • 华为云短信服务教你用C++实现Smgp协议
    本文分享自华为云社区《华为云短信服务教你用C++实现Smgp协议》,作者:张俭。引言&协议概述中国联合网络通信有限公司短消息网关系统接口协议(SGIP)是中国网通为实现短信业务而制定的一种通信协议,全称叫做ShortMessageGatewayInterfaceProtocol,用于在短消息网关(SMG)和服务提供商(SP......
  • C/C++ 位域注意事项
    C/C++位域注意事项:一、位域定义与布局可以使用无名域位,这样的域位主要用来补齐或调整位置,但不能被直接使用。位域的长度不能大于其类型说明符中指定类型的固有长度。例如,int类型的位域长度不能超过32位,char的位域长度不能超过8位。二、位域的使用与对齐在使用位......
  • LeetCode 算法:缺失的第一个正数c++
    原题链接......