在c中初始化文本文件中的struct

时间:2013-11-17 16:15:47

标签: c struct

我有一个包含几个成员的结构,我需要从文本文件初始化它们。 文本文件包含使用相同名称的结构中所有成员的值。 是否存在,遍历结构中的所有成员并将变量名称作为字符串引用以进行比较?

例如:

typedef struct pra_gen_con_file {
        int num_of_tasks;
        char vsr_id[1000];
} pra_gen_con_file_t;

在文本配置文件中我有:

num_of_tasks = 5
vsr_id = lior

我需要这样的东西:

for line in text_file_lines:
  for member in pra_gen_con_file.members():
    if member.member_name == line.split('=')[0]:
      pra_gen_con_file.member = line.split('=')[1]

我需要在C中实现。

由于 利奥尔

1 个答案:

答案 0 :(得分:2)

这种内省功能虽然在Python这样的语言中非常惯用,但在C语言中是不可能的(没有一些非常奇怪的黑客将依赖于调试信息)。编译器通常不会在生成的二进制文件中存储变量的名称,因此对struct成员的所有引用都是通过将偏移量添加到内存中struct的位置来完成的

您必须手动解析并分配给变量名。

采用以下C代码:

struct my_struct
{
    int a;
    int b;
    float f;
};

void assign(void * a)
{
    struct my_struct * m = (struct my_struct*) a;
    m->a = 100;
    m->b = -10;
    m->f = 44.1;
}

编译时,编译器实际生成以下程序集(x86_64 Linux,GCC 4.8):

assign:
.LFB20:
.cfi_startproc
  movl $100, (%rdi) ;move 100 into the the memory location stored in register %rdi
  movl $-10, 4(%rdi); move -10 into (%rdi)+4bytes
  movl $0x42306666, 8(%rdi) ;move 44.1(hex representation) into (%rdi)+8 bytes
  ret
.cfi_endproc