如何检查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
当您阅读每一行时,您会发现每一行都包含名为 name
、title
和 year
的字段。由于代码中的结构只知道 name
和 title
,它只会填充这些字段,应该忽略其余部分。
这里有一些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 布尔值的方法。
然后,您可以制作功能相同且非常接近您尝试编码的东西。
如何检查我的结构在 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
当您阅读每一行时,您会发现每一行都包含名为 name
、title
和 year
的字段。由于代码中的结构只知道 name
和 title
,它只会填充这些字段,应该忽略其余部分。
这里有一些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 布尔值的方法。 然后,您可以制作功能相同且非常接近您尝试编码的东西。