我有一个结构obj
和一个函数(在单独的文件中),该函数使用一些值填充该结构。由于系统设计的原因,此功能不能成为结构的一部分(由脚本生成)。
最终,结构可能会更改,因此应相应更新功能。问题在于,更改结构的开发人员可能会忘记更新相应的功能,而编译器不会提醒您(如果要添加一些参数,而现有参数保持不变)。
我想到的最好的主意是在编译时检查sizeof(obj)
并将其与以前的已知大小进行比较。当结构更改大小时,编译器将引发错误,因此开发人员将仔细查看此函数并进行更新。
This question提供了STATIC_ASSERT
的解决方案。问题在于,编译器无法打印结构的当前大小。因此,开发人员将不知道要设置为新的预期结构大小。
我想要这样的东西:
STATIC_ASSERT(sizeof(obj) == 1234)
编译器应输出类似以下内容的
error: ... sizeof(obj) is 5678 ...
如果sizeof(obj)符合预期,则编译器不应打印任何内容。
This solution打印带有sizeof()
值的警告,但是在我的构建环境中,警告被视为错误,因此我无法应用此解决方案:因此,我的构建将一直失败警告。
那么只有在sizeof
与预期不符的情况下,如何使编译器发出错误或警告?
答案 0 :(得分:2)
在编译时“显示”值的一种方法是出现错误:
template <std::size_t N> struct Debug; // No definition
template <> struct Debug<1234> {}; // Definition for "old" sizeof;
template struct Debug<sizeof(obj)>; // Issue error if definition is missing
Demo without error
Demo with error
错误消息类似于:
错误:在模板定义之前明确实例化了“
struct Debug<5678ul>
”