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

How to check if a struct member exists in C?

如何检查我的结构在 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");
  }
}

更新:

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

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

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

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

以包含名称和标题的示例 struct 为例,假设您有这样一个文件:

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

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

这里有一些pseudo-code来说明:

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);
        }
    }
}

您可以将类型字段添加到所有可能被检查的结构中。添加一个枚举来表示类型,并使用一个采用结构指针的方法、一个来自枚举的类型和一个 returns 布尔值的方法。 然后,您可以制作功能相同且非常接近您尝试编码的东西。