2011-08-04 4 views
0

私はインターネット上でconst + externをgoogledしましたが、実際には私の質問には良い答えはないようです。externとconstの組み合わせを持つ変数についての質問

constは、内部リンケージを意味しますが、コンパイル単位の間でconst変数を共有したい場合にのみ使用します。 externが最適ですか?

一般的な解決策は、次のようになります。

//g.h 
extern const int MAX; 

// g.c 
extern const int MAX = 3; 

しかし、この解決策は以下のように、欠点を持っている: "エラーC2057:予想定数式"

// Say, I want to use this MAX in the same header file. 
// g.h 
extern const int MAX; 
class AClass 
{ 
public: 
    AClass(): i(MAX){} 
private: 
    int i; 
}; 

コンパイラは次のように文句を言うでしょう。

解決方法はありますか?

// g.h 
enum { MAX = 3; } 

// g.c 

#include "g.h" 
static char buf[MAX]; 

あなたはMAXのアドレスを取得することはできませんが、今度はあなたがゼロではこれを取得:

+0

IIRC VSはあなたがヘッダー内の 'のexternのconst int型の最大値= 3'そして'のconst int型の最大値を行うことができます; 'ソースで。これは、少なくとも静的メンバー変数に対して機能します。あなたがそこに定義しているので、ソースファイル内のexternキーワードを削除してみてください。 – RedX

+0

これは複数の定義を引き起こしませんか? –

+0

@DaiHaoci:どうして最初に外部リンケージが必要なのですか?あなたはそれにどのような利点があると思いますか? – ildjarn

答えて

3

が、それはコンパイル時に知られていなければならない、すなわち、それは外部リンケージを持つことができません。

ただし、ヘッダーファイルに定数を宣言して、その定数を含む誰でも使用できるようにすることができます。それでも、外部リンケージとまったく同じ効果はありません。

// a.h 
const int MAX = 3; 

// a.cpp 
#include "a.h" 
int b[a]; 
+2

コンパイル単位の中で 'b [a]'を共有したいのですが? –

3

一定の整数のための簡単な解決策は、列挙型を使用することですメモリコスト。

+0

ヘッダファイルに 'buf'を定義したいのですが。 –

+0

@DaiHaoci:あなたはこの解決策でそれを正確に行うことができます。 – ildjarn

+0

あなたは正しいです。しかし、私の質問は、コンパイル単位間でconst変数を共有する方法に似ています。 –

0

なぜ#defineを使用しないのですか?あなたは(VLAを使用せずに、すなわちサイズそれによって配列)コンパイル時にあなたの定数を使用することができるようにしたい場合は

#define MAX 3 
2
extern const int MAX; 
int i[MAX]; 

を行うことはできません。

const int MAX = ReadAnIntegerFromTheConsole(); 

完全に有効で法的ですが、whoopsies-は定数式ではありません。一人で

+0

しかし、なぜexternとconstを組み合わせることが許されていますか? –

+0

@DaiHaoci:前者はリンケージ指定子であり、後者はタイプデコレータです。 'const'は内部リンケージ(' static')を意味します_by default_;そのデフォルトを覆すことはできません。 – ildjarn

+0

@ildjarn:デフォルトを覆した後にその文字が変更されました。 'extern'でなければ' int i [MAX] 'と宣言できます。 –

2

const内部リンケージ

これは正しくないことを意味し、staticconstがちょうどオブジェクトが変異することができないと言い、内部リンケージを示しています。変数を宣言してみてください

extern static int foo; 

あなたのコンパイラは、矛盾するリンケージについて文句を言います。翻訳単位間でconstを共有することは、あなたが提案したことを正確に行います。ここでは、ソースファイルのヘッダ

extern const int MAX; 

const int MAX = 10; // note you can omit the extern here 
+0

'MAX 'を' const'として宣言/定義した方が、あなたの答えはもっと意味があります。 ; - ] – ildjarn

+0

@ildjarn良い点:) – Praetorian

1

はあなたの問題を解決することがあり実施例です。要約すると、ヘッダーファイルの定数として配列サイズを定義します。別のヘッダファイルでは、配列をexternと宣言します。以下の例では、配列のインクルードファイルを使用せずに配列をexternとして参照しています。

array_size.hpp

const unsigned int MAX_ARRAY_SIZE = 16; 

array.cpp

#include "array_size.hpp" 
int array[MAX_ARRAY_SIZE]; 

main.cppに

#include "array_size.hpp" 

// Reference the array from array.cpp 
extern int array[MAX_ARRAY_SIZE]; 

int main(void) 
{ 
    array[1] = 7; 
    return 0; 
} 

* array_size.hpp *ファイルはサイズを定義し、識別子はヘッダーを含めることによって他の翻訳単位で使用できます。

私が使用してCygwinの上でコンパイル:

g++ -I. -o array.exe main.cpp array.cpp 
関連する問題