1

データ ポインター、データ サイズ、およびデータ バージョンの静的 (ファイル スコープ) テーブルを作成したいと考えています。問題は、データが外部ファイルにあるのに、extern ファイルに定数があることです。

例:

file1.c

    const unsigned char data1[] =
    {
    0x65, 0xF0, 0xA8, 0x5F, 0x5F,
    0x5F, 0x5F, 0x31, 0x32, 0x2E,
    0x31, 0xF1, 0x63, 0x4D, 0x43, 
    0x52, 0x45, 0x41, 0x54, 0x45,
    0x44, 0x20, 0x42, 0x59, 0x3A,
    0x20, 0x69, 0x73, 0x70, 0x56, 
// ...
    };
    const unsigned int data1_size =
        sizeof(data1) / sizeof(data1[0]);
    const unsigned int data1_version = 1;

file2.c

    const unsigned char data2[] =
    {
    0x20, 0x44, 0x61, 0x74, 0x61,
    0x20, 0x52, 0x6F, 0x77, 0x20,
    0x3D, 0x20, 0x34, 0x38, 0x12, 
//...
    };
    const unsigned int data2_size =
        sizeof(data2) / sizeof(data2[0]);
    const unsigned int data2_version = 1;

main.c

struct Data_Info
{
  unsigned char * data_ptr;
  unsigned int    data_size;
  unsigned int    data_version;
};

extern const unsigned char data1[];
extern const unsigned int  data1_size;
extern const unsigned int  data1_version;

extern const unsigned char data2[];
extern const unsigned int  data2_size;
extern const unsigned int  data2_version;

static struct Data_Info  Data_Info_Table[] =
{
  // How to set this up??
  // The compiler wants constant expressions here,
  //    and the extern is not considered a constant expression
  // This is what I tried:
  { data1, data1_size, data1_version},
  { data2, data2_size, data2_version},
};

int main(void)
{
  return 0;
} 

Green Hills Compiler 4.2.3 を使用しています。正確なエラー メッセージ:

error #28, expression must have a constant value.

私の以前の投稿を参照してください:
C: 外部 const ints in a array of const struct

注: これは C++ にも適用されるため、C++ タグが含まれています。

4

4 に答える 4

2

やってみました?(X は 0 または 1 です。)

struct Data_Info    
{    
  unsigned char const * data_ptr;    
  unsigned int    data_size;    
  unsigned int    data_version;    
};    

ファイルX.h

extern const struct Data_Info data_infoX;

fileX.c

const struct Data_Info data_infoX = { dataX, dataX_size, dataX_version };

main.c

const struct Data_Info const * Data_Info_Table[] = 
{ 
  &data_info1,
  &data_info2
}; 
于 2010-07-27T00:13:08.247 に答える
1

問題は、コンパイラがフィールドのメンバーdata_sizeとメンバーに配置する値を認識していないことです。data_version大騒ぎせずにこれを回避する方法はいくつかあります。

アプローチ1:

#include "data1.c"
#include "data2.c"

...
static struct Data_Info  Data_Info_Table[] =
{
  { data1, sizeof(data1), 1},
  { data2, sizeof(data2), 1},
};

アプローチ2:

struct Data_Info
{
  unsigned char * data_ptr;
  unsigned int *  data_size;
  unsigned int *  data_version;
};

...

static struct Data_Info  Data_Info_Table[] =
{
  { data1, &data1_size, &data1_version},
  { data2, &data2_size, &data2_version},
};

jyoungによってすでに示されているように、3番目のアプローチは、メンバーを個別のデータファイルに割り当て、それらのアドレスをData_Info_Tableに含めることです。

于 2010-07-27T00:22:57.027 に答える
0

私は C の専門家ではありませんが、異なる翻訳単位での初期化の順序はおそらく未定義です (C++ では未定義であることを知っており、C で動作が異なる場合、互換性が大きく損なわれることになります)。たとえコンパイラによって許可されていたとしても、それは危険です。

現在、C++ タグを追加しても、あまり役に立たない可能性が高いです。私の知る限り、これは言語だけでなく、言語の特定のバージョンである C89/C99 にも依存しているためです。C++ では、初期化をヘッダー ファイル内の定数の宣言に移動すると機能します。繰り返しますが、私は C の専門家ではありません。

于 2010-07-26T23:34:48.530 に答える
0

定数を定義するときは、extern キーワードを使用します。

于 2010-07-26T22:50:49.413 に答える