【问题标题】:How to check if a struct member exists in C?如何检查C中是否存在结构成员?
【发布时间】:2026-01-14 23:00:02
【问题描述】:

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

更新:

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

【问题讨论】:

  • 这不会编译,所以这就是你会知道的。如果您想实现可以在运行时添加或删除成员的结构,这是一个更复杂的主题。
  • @DanielKamilKozar 不,我不需要可以添加或删除成员的结构。我只需要检查一个成员是否存在,如果存在就给它一个值。

标签: c struct c99


【解决方案1】:

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

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

【讨论】:

【解决方案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);
        }
    }
}

【讨论】:

  • 感谢您的回复。也许这是 C 的唯一途径。非常感谢!
【解决方案3】:

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

【讨论】: