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

3

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

更新:

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


9
这段代码无法通过编译,因此你会知道它不能正常运行。如果你想实现可以在运行时添加或删除成员的结构体,这是一个更加复杂的主题。 - Daniel Kamil Kozar
@DanielKamilKozar 不,我不需要一个可以添加或删除成员的结构体。我只需要检查成员是否存在,并在存在时给它赋值。 - artnikpro
3个回答

6

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

这与其他语言(例如Java)不同,其他语言支持反射。


C支持通用选择,因此可以在编译时检查结构体的类型。 - Anderson Green

3
你可以在所有可能被检查的结构体中添加一个类型字段。添加一个枚举来表示这些类型,并使用一个方法,该方法需要一个结构体指针、枚举类型和一个返回布尔值的方法。 然后你可以编写一个功能等同于你尝试编写的代码,非常接近它。

3
当您阅读所涉及的文件时,您应该知道每个字段是什么。由于您在编译时知道您感兴趣的字段,因此代码只会查找这些字段。
以包含名称和标题的样本结构为例,假设您有一个像这样的文件:
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语言的唯一出路。非常感谢! - artnikpro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接