ヘッダファイルでconstグローバル変数を定義する際に注意すべき問題

1191 ワード

C++(ただしC言語ではない)では、const制限子がデフォルトのストレージタイプに少し影響を及ぼすことがわかります.デフォルトでは、グローバル変数のリンク性は外部ですが、constグローバル変数のリンク性は内部です.すなわち,C++から見れば,グローバルconst定義はstatic説明子を用いたように見える.
 
したがって、const定数定義は、プロジェクト内の複数の他のファイルに参照を含めるためにヘッダファイルに定義でき、コンパイル時に変数の繰り返し定義のエラーは発生しません.もちろん、#defineマクロで定義することもできます.
 
一般定数定義は問題ありませんが、constがポインタを限定する場合は特に注意してください.ここでは文字配列を例に挙げて説明する.
#ifndef CONST_HEADER_H_ 
#define CONST_HEADER_H_  
  
const char* CONST_STRING = "wangqi";          //   !   CONST_STRING    const   ,        
                                             //              ,             。  
const char* const CONST_STRING = "wangqi";  //   ,CONST_STRING           。  
const char CONST_STRING[] = "wangqi";       //   ,          
                                           //CONST_STRING   const char [7]   。 
char* const CONST_STRING = "wangqi";      //   ,CONST_STRING      。  

namespace //     
{  
    char CONST_STRING[] = "wangqi";   
}  
  
namespace //     
{  
    char* CONST_STRING = "wangqi";   
}  
  
namespace //     
{  
    const char* CONST_STRING = "wangqi";   
}  
#endif // CONST_HEADER_H_