初始化具有外部常量整数的结构数组时,我收到错误消息“表达式必须具有常量值。”
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);
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);
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.
};
我还从const
的{{1}}字段中删除了size
限定符,并收到相同的错误消息。
为什么编译器在Array_Attributes
和data1_size
为data2_size
但是在不同的翻译单元时抱怨常量值表达式?
我想要一个在编译时生成的[数组地址,数组大小]的常量数组。
我在Windows XP上使用Green Hills const unsigned int
4.24,C语言不 C ++。
答案 0 :(得分:7)
C const
限定符与编译器认为constant expression
的内容几乎没有关系。在初始化程序中,即
const struct attributes attrs[] = {
{ expr1, expr2 },
...
}
expr1
和expr2
必须具有非常具体的形式才能被编译器接受。这些限制的结果是可以在不从程序变量中获取的情况下计算表达式,因为这些表达式在编译时不存在。
您正在尝试使用data1_size
和data2_size
,这些规则不是编译时常量。
顺便说一句,声明
const unsigned char data1[] = { ... };
和
extern const unsigned char *data1;
不兼容,会导致代码中出现错误。后者应该是
extern const unsigned char data1[];