在编译时声明sizeof(obj)并在不匹配时打印实际大小(c ++ 98)

时间:2019-05-10 21:56:53

标签: c++ c++98

我有一个结构obj和一个函数(在单独的文件中),该函数使用一些值填充该结构。由于系统设计的原因,此功能不能成为结构的一部分(由脚本生成)。 最终,结构可能会更改,因此应相应更新功能。问题在于,更改结构的开发人员可能会忘记更新相应的功能,而编译器不会提醒您(如果要添加一些参数,而现有参数保持不变)。

我想到的最好的主意是在编译时检查sizeof(obj)并将其与以前的已知大小进行比较。当结构更改大小时,编译器将引发错误,因此开发人员将仔细查看此函数并进行更新。

This question提供了STATIC_ASSERT的解决方案。问题在于,编译器无法打印结构的当前大小。因此,开发人员将不知道要设置为新的预期结构大小。

我想要这样的东西:

STATIC_ASSERT(sizeof(obj) == 1234)

编译器应输出类似以下内容的

error: ... sizeof(obj) is 5678 ...

如果sizeof(obj)符合预期,则编译器不应打印任何内容。

This solution打印带有sizeof()值的警告,但是在我的构建环境中,警告被视为错误,因此我无法应用此解决方案:因此,我的构建将一直失败警告。

那么只有在sizeof与预期不符的情况下,如何使编译器发出错误或警告

1 个答案:

答案 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>