C++基础(八)-尽量以const替换#define

在旧版本C中,如果想建立一个常量,必须使用预处理器。

#defineMAX 1024;// const int max = 1024

我们定义的宏MAX从未被编译器看到过,因为在预处理阶段,所有的MAX已经被替换为了1024,于是MAX并没有将其加入到符号表中。但我们使用这个常量获得一个编译错误信息时,可能会带来一些困惑,因为这个信息可能会提到1024,但是并没有提到MAX.如果MAX被定义在一个不是你写的头文件中,你可能并不知道1024代表什么,也许解决这个问题要花费很长时间。

解决办法就是用一个常量替换上面的宏。

constint max= 1024;

const和#define区别总结:

1.const有类型,可进行编译器类型安全检查。#define无类型,不可进行类型检查.

2.const有作用域,而#define不重视作用域,默认定义处到文件结尾.如果定义在指定作用域下有效的常量,那么#define就不能用。

1. 宏常量没有类型,所以调用了int类型重载的函数。const有类型,所以调用希望的short类型函数?

#define PARAM 128
const short param = 128;
 
void func(short a){
    cout << "short!" << endl;
}
void func(int a){
    cout << "int" << endl;
}

2. 宏常量不重视作用域.

void func1(){
    const int a = 10;
    #define A 20
    //#undef A  //卸载宏常量A
}
void func2(){
    //cout << "a:" << a << endl; //不可访问,超出了const int a作用域
    cout << "A:" << A << endl; //#define作用域从定义到文件结束或者到#undef,可访问
}
int main(){
    func2();
    return EXIT_SUCCESS;
}
问题: 宏常量可以有命名空间吗?
namespace MySpace{
    #define num 1024
}
void test(){
    //cout << MySpace::NUM << endl; //错误
    //int num = 100; //命名冲突
    cout << num << endl;
}

你可能感兴趣的:(C/C++)