C++ベース(8)-できるだけconstで#defineを置き換える

1483 ワード

旧バージョン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;
}