如何检查C中是否存在结构成员?

时间:2017-01-30 20:21:08

标签: c struct c99

如何检查我的结构在C99中是否有成员something

#include <stdlib.h>
#include <string.h>

struct some {
  char title[50];
  char name[50];
};

int main() {
  struct some s;

  if (*s.something) { // Error: no member named 'something' in 'struct.some'
    strcpy(s.something, "Hello");
  }
}

更新:

我不需要知道它是否在编译时存在,而是在构建的程序中。成员及其值将从文件中解析,然后循环使用到结构中,但我需要确保它将跳过所有不存在的成员。

3 个答案:

答案 0 :(得分:3)

C99(甚至C ++)不支持反射。因此,无法在运行时检查结构是否包含具有特定名称的成员;编译器会在编译时告诉你。

这与其他语言不同,例如支持反射的java。

答案 1 :(得分:2)

当您阅读相关文件时,您应该知道每个字段是什么。由于您知道在编译时您感兴趣的是哪些代码,因此代码只会查找这些字段。

将您的样本struct包含名称和标题,假设您有一个这样的文件:

name:myname1,title:mytitle1,year:2016
name:myname2,title:mytitle2,year:2017

当您阅读每一行时,您会发现每一行都包含名为nametitleyear的字段。由于代码中的结构只知道nametitle,因此它会填充这些字段,并且应该忽略其余字段。

这里有一些伪代码来说明:

void processline(char *line, struct some *data) {
    char key[50];
    char value[50];
    while (getnextpair(line,key,value)) {
        if (!strcmp(key, "name") {
            strcpy(data->name, value);
        } else if (!strcmp(key, "title") {
            strcpy(data->title, value);
        } else {
            printf("unknown field %s\n", key);
        }
    }
}

答案 2 :(得分:1)

您可以为可能检查的所有结构添加类型字段。添加枚举以表示类型,并使用一个方法来获取结构指针,枚举中的类型以及返回bool的方法。 然后你就可以创造出与你试图编码的东西功能相当的东西。