define和const的区别
define和const都是定义一个常量在后续的代码中使用,但是他们又有本质的区别,具体如下。
1,类型安全
define是预处理指令,在预处理阶段(编译之前)就会进行文本替换,编译器不会检查define定义的值的类型。
const是c++关键字定义的是常量变量,编译器会对const进行类型检查,确保类型正确。
#define VALUE 10
const int VALUE_CONST = 10;
int main() {
double result1 = VALUE * 2.5; // 编译器不知道 VALUE 的类型,但能运行
double result2 = VALUE_CONST * 2.5; // 编译器知道 VALUE_CONST 是 int 类型
return 0;
}
2,作用域
define在文件范围内有效,甚至有可能影响到其他文件的命名空间,如果在不同的地方定义相同的宏,可能会造成文件冲突。
const可以是局部作用域也可以是全局作用域。
3,调试和错误排查
define是预处理阶段直接替换的文本,调试器无法看到替换后的值,使得调试过程中错误难以排查,即使写错替换的 内容也不会有编译器检查。
const会检查常量的类型,并且可以使用调试器查看常量的值。
#define VALUE 10 + 5
int main() {
int x = VALUE * 2; // 实际替换为 10 + 5 * 2,结果是 20,而不是期望的 30
return 0;
}
4,内存使用
define在预处理阶段就行进行文本替换,所以他不会在内存中储存实际的变量,也没有分配地址的过程。常量会直接嵌入到生成的代码当中,多次使用会增加代码长度(重复定义)。优化程度依赖编译器。
const一个只读的变量,有具体的类型和值,编译器会在内存中为它分配地址。如果常量是编译时已知的值,编译器可能会将其内联,从而与 #define 类似不占内存。如果不能内联,则会在内存中分配空间,但有类型安全和调试信息。
5,使用限制
define不能定义复杂类型,数组或对象。但是可以定义函数类型表达式。
const可以定义复杂类型,可以与其他c++11特性,例如类,模板等结合使用。
6,使用建议
使用场景 | 推荐方式 |
---|---|
定义常量 | const 类型安全、易于调试和维护 |
需要替换的字符串 | constexpr |
定义函数或表达式 | constexpr 或 inline |
单纯替换文本 | #define |
2,typedef和using的区别
typedef和using都可以定义类型别名,但是又有一些关键性的区别。
using可以用来导入命名空间。
1,基本用法
别名定义中,typedef和using功能相同,但是using语法相对简洁清晰。
typedef定义类型别名
//普通变量
typedef int Integer;
Integer a = 10; // a 是一个 int 类型的变量
//函数指针
int Compare(const int val1, const int val2)
{
return (val1 > val2) ? 1 : ((val1 == val2) ? 0 : -1);
}
typedef int(*CompareType)(const int ,const int);
using定义类型别名
//普通变量
using Integer =int
Integer a = 10; // a 是一个 int 类型的变量
//函数指针
int Compare(const int val1, const int val2)
{
return (val1 > val2) ? 1 : ((val1 == val2) ? 0 : -1);
}
using CompareType = int(*)(const int ,const int);
2,模板化支持
typedef只支持具体类型化的别名
示例
typedef std::vectro<int> IntVec;//支持
template<typename T>
typedef std::vectro<T> TVec;//不支持
template<typename T>
int Compare(const T val1, const T val2)
{}
typedef int(*TCompare)(const T val1,const T val2);//不支持
using支持模板化的别名,适合泛型编程
示例
using IntVec = std::vectro<int> ;//支持
template<typename T>
using TVec = std::vectro<T> ;//支持
template<typename T>
int Compare(const T val1, const T val2)
{}
using TCompare = int(*)(const T val1,const T val2)//支持
using Tcompare2 = decltype(Compare<T>);//支持
3,使用建议
使用场景 | 推荐方式 |
---|---|
兼容以前项目 | typedef |
开发新代码 | using |