【问题标题】:C: External const ints in a array of const structC:常量结构数组中的外部常量整数
【发布时间】:2011-02-04 12:36:34
【问题描述】:

在使用外部常量整数初始化结构数组时,我收到一条错误消息“表达式必须具有常量值”。

文件 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);

文件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);

Get_Byte.c:

extern const unsigned char * data1;
extern const unsigned int    data1_size;
extern const unsigned char * data2;
extern const unsigned int    data2_size;

struct Array_Attributes
{
    const unsigned char *    p_data;
    const unsigned int       size;
};

const struct Array_Attributes Data_Arrays[] =
{
    {data1, data1_size},  // Error message is for data1_size here.
    {data2, data2_size},  // Another error message generated for data2_size here.
};

我还从Array_Attributessize 字段中删除了const 限定符并得到相同的错误消息。

data1_sizedata2_sizeconst unsigned int 但在不同的翻译单元中时,为什么编译器会抱怨常量值表达式?

我想要一个在编译时生成的 [array address, array size] 常量数组。

我在 Windows XP 上使用 Green Hills ccarm 4.24,C 语言 NOT C++。

【问题讨论】:

    标签: c arrays struct constants extern


    【解决方案1】:

    在这种情况下,C 的 const 限定符与编译器认为的 constant expression 几乎没有关系。在初始化器中,即

    const struct attributes attrs[] = {
        { expr1, expr2 }, 
        ...
    }
    

    expr1expr2 必须具有非常具体的形式才能被编译器接受。这些限制的结果是表达式可以在不从程序变量中获取的情况下进行计算,因为这些在编译时并不存在。

    您正在尝试使用 data1_sizedata2_size,根据这些规则,它们不是编译时常量。

    顺便说一句,声明

    const unsigned char data1[] = { ... };
    

    extern const unsigned char *data1;
    

    不兼容,会导致您的代码出现错误。后者应该是

    extern const unsigned char data1[];
    

    【讨论】:

    • 我的理解是data1[]*data1是一样的。它们有何不同,为什么会导致错误?
    • 唯一可以替换的地方是在参数声明中。 extern char *foo 告诉编译器foo 是一个包含指向字符的指针的 4 字节变量。 extern char bar[] 告诉编译器bar 是一个地址常量,它指向一个未知大小的字符块。 foo[i] 首先获取 4 字节指针,添加 i,然后取消引用以获取字符。 bar[i] 取值 bar,添加 i,然后取消引用。
    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    相关资源
    最近更新 更多