2017-02-15 16 views
3

私はこの異常な配列の初期化を持っている一部のレガシーCコードに取り組んでいます:C - 異常な配列の初期化

uint32_t defsMB40000[REG40000_SIZE] = 
{ 
#include "modbusDefs40000.h" 
}; 

ヘッダファイルには、コンマのリスト番号とコメントを分けています。私は以前この構造を見たことがないが、正しく動作するように思える。ヘッダー内の持っている方が良いではないでしょう:

uint32_t defsMB40000[REG40000_SIZE] = 
{ 
    0, 
    0xFF, 
    ... 
}; 

と.cファイルで、その後

#include "modbusDefs40000.h" 

私は、ヘッダファイルがpythonスクリプトによって作成されていることさえ理由があると考えます。私はこのイディオムについてのあなたのコメントに感謝し、もしあなたがそれのようなものを見たならば。

おかげで、

JH

+0

それとも、このシーケンスは別の部分で使用されているため。とにかく、IMHOこれは悪いスタイルです。 –

+0

誰も良い方法ではありません。通常、ヘッダはオブジェクト定義を持たず、宣言のみを持つべきではありません。そのような '.inc'のように異なる拡張子が使われることもありますが、データオブジェクトを別の単位でコンパイルし、使用する場合はいつでも外部宣言を使用するのが最善の方法です。 'static' storge指定子を使わなければならない限り、その効果は同じになります。 – Olaf

+1

これは、イニシャライザが外部生成されている状況(これは明らかにあなたの例のように)において、これを行うための完璧な方法です。 – AnT

答えて

3

これは、Cプリプロセッサのルールを使用して、仕事を取得するだけのトリックです、イディオムではありません。基本的に、著者たちは、Cプリプロセッサがファイルの内容が文字通り包含のポイントに埋め込まれているかのように動作するという事実に頼っていました。結果は面倒ですが、配列を初期化する作業が完了します。

Cのヘッダーには特定の構造があると予想されるため、modbusDefs40000.hという名前のファイルは誤解を招きます。別の拡張子を使用します(例: modbusDefs40000.dataまたはそれと同じ効果を持つものは、ファイルの目的をより明確にします。

方が良い明確にするためにこれをリファクタリングする方法を探している場合は、列の前方宣言をヘッダにすることを検討、すなわち

// modbusDefs40000.h 
extern uint32_t defsMB40000[REG40000_SIZE]; 

とデータの周りの完全な宣言を生成するPythonスクリプトを変更します初期化子の一部(すなわち、2つの固定回線 - 上部のuint32_t defsMB40000[REG40000_SIZE] = {と下部の};ファイルmodbusDefs40000.c生成呼び出し、プロジェクト内の他のCファイルと一緒にそれを使用

+1

コメントありがとうございます。 dasblinkenlight、私はあなたが提案するように.cファイルを作るでしょう。 JH – user2579721