旧版C++结构体构造器语法疑问与迁移适配咨询
解答
1. 旧版C++标准的要求
任何版本的C标准(包括最早的C98)都从未要求结构体构造器前添加struct关键字。这种写法是C语言的遗留习惯——在C中,未用typedef给结构体起别名时,声明变量需要写struct 结构体名,但C++从诞生起就取消了这个限制,构造器语法明确规定必须直接使用结构体/类的名称,不需要前缀。
当年的编译器能通过这段代码,是因为编译器做了兼容C的宽松处理,允许这种非标准写法。
2. 该函数是否为构造器
这段代码里的函数就是构造器,没有未知副作用,作用是将PropertyPresence数组初始化为全0。你移除struct的修改完全正确,符合所有C++标准,现代编译器可正常编译,且功能与原代码一致。
额外建议:可以把构造器里的memset换成更符合C++风格的初始化方式,比如成员初始化列表:
PROPERTIES_PRESENT() : PropertyPresence{} {}
这种写法更安全,也无需依赖memset(虽然原代码用了sizeof(bool)规避了大小问题,但C++原生初始化更地道)。
内容的提问来源于stack exchange,提问作者Sperry
相关产品推荐
相关产品推荐

