【发布时间】:2014-11-12 04:57:14
【问题描述】:
我有一个结构数组,其中一些结构成员是常量 我想制作数组的深层副本。 该副本也将具有相同的结构成员是常量。 如何在不违反 const 指令的情况下将值初始化到新数组中。
以下是我的代码的摘录。实际程序很长,但我想我已经包含了所有相关代码。在这个例子中 keys 被声明为一个全局变量,我想从中创建新实例。我将其视为具有预设值的模板。
当我尝试在 Debian 中使用 gcc 进行编译时,出现以下错误:
main.c:216:9: error: assignment of read-only location ‘*(new_keys + (unsigned int)((unsigned int)index * 540u))’make: *** [main.o] Error 1
makefile 使用以下限定符:
CFLAGS=-c -g -std=gnu99 -D_XOPEN_SOURCE=700
有趣。即使将 Xcode 设置为 C 语言方言 GNU99[-std=gnu99]
,我也可以在 Xcode 中编译相同的代码而不会出现错误或警告我可以通过去掉 const 关键字来使我的代码正常工作。但这些值确实应该是 const。一旦这些数组被初始化,它们就永远不会改变。我想了解如何正确执行此操作,并且我想知道为什么这在 Xcode 而不是 gcc 中有效。
头文件
typedef struct {
char * name;
char * alias;
int number;
} pair_int_t;
typedef struct {
const char * const name;
const kind_t kind; // kind is enum type
const pair_int_t * const enum_array;
bool received;
const char * const alias;
} key_descriptor_t;
typedef key_descriptor_t keys_descriptor_t[_END_OF_KEYS+1];
main() 之前的 .c 程序主体
const pair_int_t command_list[] = {
{.name = "numeric data response", .alias = "num", .number = RES_NUMERIC_DATA},
{.name = "read attribute", .alias = "readat", .number = CMD_READ_ATTR},
//..
}
// declare a global variable *keys* with constants assigned to it
key_descriptor_t keys[] = {
[_COMMAND] = {.name = "command", .kind = ENUMERATED, .alias = "com", .enum_array = command_list},
[_RESPONSE] = {.name = "response", .kind = ENUMERATED, .alias = "res", .enum_array = command_list},
[_UNIT] = {.name = "unit number", .kind = NUMBER, .alias = "uni", .enum_array = NULL},
//..
}
int initialize_new_keys(keys_descriptor_t new_keys) {
int index;
for (index = _FIRST_KEY; index <= _END_OF_KEYS; index++){
new_keys[index] = keys[index]; // line 216, keys is a global variable
}
return index;
}
主程序
int main(int argc, const char * argv[]){
keys_descriptor_t 2nd_set_of_keys;
initialize_new_keys(2nd_set_of_keys);
}
【问题讨论】:
标签: c arrays struct copy constants