代码之家  ›  专栏  ›  技术社区  ›  Thomas Matthews

如何创建具有外部值的表(数组)?

  •  1
  • Thomas Matthews  · 技术社区  · 14 年前

    我想创建一个静态(文件范围)表,其中包含数据指针、数据大小和数据版本。问题是数据在外部文件中,而常量在外部文件中。

    例子:

    文件1.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;
    

    文件2.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;
    

    主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编译器,4.2.3。确切的错误信息:

    error #28, expression must have a constant value.
    

    查看我以前的帖子:
    C: External const ints in a array of const struct

    注意:C++标签包括在内,因为这也适用于C++。

    4 回复  |  直到 14 年前
        1
  •  1
  •   torak    14 年前

    问题是编译器不知道要放入的值 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已经演示的那样,是在单独的数据文件中分配成员,并将其地址包含在data_info_表中。

        2
  •  2
  •   jyoung    14 年前

    你试过了吗?(其中x是0或1。)

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

    菲莱克斯

    extern const struct Data_Info data_infoX;
    

    菲利克斯C

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

    主C

    const struct Data_Info const * Data_Info_Table[] = 
    { 
      &data_info1,
      &data_info2
    }; 
    
        3
  •  0
  •   Clark Gaebel    14 年前

    定义常量时,请使用extern关键字。

        4
  •  0
  •   David Rodríguez - dribeas    14 年前

    我不是一个C专家,但是不同的翻译单元的初始化次序很可能是未定义的(我知道它在C++中是未定义的,如果C中的行为不同,这将是一个巨大的兼容性破坏),所以即使编译器允许,它也是危险的。

    现在,添加C++标签很可能不会有太大的帮助,因为这不仅依赖于语言,而且还依赖于语言的特定版本:C89/C99。在C++中,如果将初始化移动到头文件中常量的声明,则可以工作。我又不是C专家。

    推荐文章