2011-01-06 11 views
1

宣言された型にプリベークされた "デフォルト"をたくさん使用するC++バックグラウンドのヘッダがいくつかあります。例えば私は互換性の理由からCまでにこれらのヘッダを変換する必要がありC - Cのヘッダの型のデフォルト値の設定方法

// Header. 

typedef struct 
{ 
    float red; 
    float green; 
    float blue; 
} RGBColor; 

// Defaults. 
const RGBColor kRGB_White = {1.0f, 1.0f, 1.0f}; 
const RGBColor kRGB_Black = {0.0f, 0.0f, 0.0f}; 

...

// Source file. 

RGBColor aColor = kRGB_White; 

Q.。できればデータ構造自体を変更することなく、Cヘッダのこれらのデフォルト値を再作成する方法はありますか?

ありがとうございました。

extern const RGBColor kRGB_White; 
extern const RGBColor kRGB_Black; 

とにリンクされます単一.cファイルに定義を配置します。重複したグローバル定義の問題を防ぐため

答えて

5

は、あなたがにヘッダにごconst構造の宣言を変更したいと思います。

代替は、彼らはいくつかの異なるモジュールで終わるとき、それは傷つけないように静的であるとconstの構造を変更することです:

static const RGBColor kRGB_White = {1.0f, 1.0f, 1.0f}; 
static const RGBColor kRGB_Black = {0.0f, 0.0f, 0.0f}; 

これは、オブジェクトが最終的にリンクされたイメージに複数回表示される可能性がありますが、今日のリンカーはおそらく重複を取り除くほどスマートです(私は思っています。大規模でありかつ/または多数である)。あなたが他の変数を初期化するためにconstsを使用して心配している場合

、この:

RGBColor aColor = kRGB_White; 

は(Cで結構です、プログラマがCは、いくつかのためにこれを許可しないことを考えるすることは比較的一般的なようです理由 - おそらく、それは事前標準Cで許可されていなかったかもしれない)。あなたは、ヘッダファイルのうち、デフォルト値の宣言を移動できない場合

+0

私は多くの人が考える信じる 'てRGBColor aColor = kRGB_White;'なぜなら 'int型のfoo [C法的ではありません4] = {1,2,3,4}; int bar [4] = foo'は正当ではなく、配列は構造体よりも多くの露出を持つようです。 – SiegeX

+1

私は 'static const'アプローチを推奨する傾向があります。リンク時クロスモジュール最適化を必要とせずに' const'オブジェクトの定義をコンパイラが利用できるようにします。静的な保存期間を持つオブジェクトを初期化するために 'const'オブジェクトを使うこともできません。そのために' #define KRGB_WHITE_STATIC {1.0f、1.0f、1.0f} 'を作成する必要があります。 – caf

+0

ご協力いただきありがとうございます。 OS X 10.6.6でgcc 4.0を使用すると、 "静的const"アプローチによって "重複シンボル"エラーが発生しました。悲しい顔。そして、さらに悲しいことに、マクロアプローチとしてそれらを再定義することはどちらもうまくいかなかった。私はそれらをexternsとして宣言し、すべてをソースファイルに貼り付けるようアドバイスをしなければならないと思います。乾杯。 – SirRatty

1

、マクロとしてそれらを再定義:

// Might not be a clean solution... 
#define kRGB_White {1.0f, 1.0f, 1.0f} 
#define kRGB_Black {0.0f, 0.0f, 0.0f} 
+1

C99を保証できるならば、少なくとも '((RGBColor){1.0f、1.0f、1.0f})'を実行して、 'float f [] = kRGB_White;'のようなものを試してはいけないようにすることができます。 [明確で明白な文書ではなく、人が愚かなことを型システムを介して行うことを阻止しようとする無駄について、免責条項を挿入する。] –

+1

これはイニシャライザとして機能しますが、割り当てでは機能しません。また、左辺の文脈では機能しません。私はOPにもこれらの用途が必要かもしれないと思います。 – AnT

+0

@AndreyT - 'const'オブジェクトはlvalueコンテキストでも動作しません。C99では、変更されたバージョンが代入で動作すると思います。 –

関連する問題