2012-02-14 3 views
1

のヘッダーのみのグローバル変数を初期化する方法:私はこのようになりますヘッダのみのライブラリで定義された機能を持っているC

inline bar **foo_ptr() { 
    static bar *value = NULL; 
    return &value; 
} 

これは、それを定義せずにグローバル変数を初期化する私のハック方法です* .cファイルに保存します。

これは(#defineインライン__inlineの後に)VS2010でうまくコンパイルされますが、MinGWでコンパイルしようとすると多重定義の怒りに腹を立てて死にます。これは私を非常に悲しくしています。

AFAIK、私はちょうどstatic inline関数を使用することはできません。なぜなら、この状況では、非常に悪いことです。

本当にこのキーワードを使用してこの作業を行う必要がありますか?私はそれを完全に間違っているのだろうか?ヘッダーのみのグローバル変数をNULLに初期化する別の方法はありますか?

私はinitメソッドから遠ざかっています。

ありがとう:D

+2

_Why_を解決しますが、ヘッダーのみのグローバル変数が必要なのでしょうか?あなたの職場には、使用を許可されているCファイルの数を制限するいくつかの企業標準がありますか? :-) – paxdiablo

+2

グローバル変数を使用するだけではどうですか?それは本質的にあなたがやっていることです。本当に難しいのです。 –

+0

@paxdiablo:はい。私は非常に小さな図書館で働いています。そして、ユーザーが1つの変数に対して余分なCファイル_just_をコンパイルするような浪費のようです。その意味で、私の職場(My House)には、このプロジェクトの企業(My House Inc.)標準(My House Standard)があり、Cファイルの数をゼロに制限しています。 :D – YellPika

答えて

0

私はここで自分の質問に答えるつもりですが、すべてがJason Cocoになります(あなた自身の回答をしたいと思えば、代わりにそれを受け入れることになります)。

とにかく、グローバル変数を初期化せずに宣言するだけでした。コンパイラは自動的にnullに設定します。

bar *foo; 

問題は:)

+0

C標準では変数の定義が1つ必要です。複数の暫定的な定義を可能にする共通の拡張機能に注意してください。共通の拡張機能をサポートするシステムでは、多くとも1つが初期化されていれば問題ありません。しかし、それは厳密に標準に準拠しているわけではありません。 (C99標準の付録Jを参照してください:§J.5.11複数の外部定義が正確です。)普遍的にサポートされていない拡張機能を使用していることが分かっている限り、それは問題ありません。 –

1

C99標準では、セクションの§6.7.4関数指定子を言う:

¶2外部リンケージを持つ関数のインライン定義が変更 の定義を含んではなりません静的記憶期間を有するオブジェクトであり、内部連結を伴う 識別子への参照を含まない。

あなたの関数は現在、ローカル変数へのポインタを返そうとしています。それはよく知られているno-noです。しかし、標準では、その変数を静的変数に変更することは禁止されています。外部変数valueがあった場合は、それを動作させることができます。しかし、それはおそらく、あなたが達成しようとしていた客観的敗北:

extern bar *value; 

inline bar **foo_ptr() { 
    value = NULL; 
    return &value; 
} 

をしかし、それはアクセス可能であるので、変数は、宣言されなければなりません。それはどこかで定義する必要があります。率直に言って、グローバル変数が必要な場合は、それを受け入れる方が良いでしょう。

関連する問題