如何检查我的结构在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");
}
}
更新:
我不需要知道它是否在编译时存在,而是在构建的程序中。成员及其值将从文件中解析,然后循环使用到结构中,但我需要确保它将跳过所有不存在的成员。
答案 0 :(得分:3)
C99(甚至C ++)不支持反射。因此,无法在运行时检查结构是否包含具有特定名称的成员;编译器会在编译时告诉你。
这与其他语言不同,例如支持反射的java。
答案 1 :(得分:2)
当您阅读相关文件时,您应该知道每个字段是什么。由于您知道在编译时您感兴趣的是哪些代码,因此代码只会查找这些字段。
将您的样本struct
包含名称和标题,假设您有一个这样的文件:
name:myname1,title:mytitle1,year:2016
name:myname2,title:mytitle2,year:2017
当您阅读每一行时,您会发现每一行都包含名为name
,title
和year
的字段。由于代码中的结构只知道name
和title
,因此它会填充这些字段,并且应该忽略其余字段。
这里有一些伪代码来说明:
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的方法。 然后你就可以创造出与你试图编码的东西功能相当的东西。