【问题标题】:Assert sizeof(obj) at compile time and print the actual size if it doesn't match (c++98)在编译时断言 sizeof(obj) 并在实际大小不匹配时打印 (c++98)
【发布时间】:2019-09-28 19:36:52
【问题描述】:

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

我想到的最好的办法是在编译时检查sizeof(obj) 并将其与之前已知的大小进行比较。当结构的大小发生变化时,编译器会抛出错误,因此开发人员会仔细查看此函数并对其进行更新。

This questionSTATIC_ASSERT 的解决方案。问题是编译器不打印结构的 current 大小。因此开发人员不知道将什么设置为新的预期结构大小。

我想要这样的东西:

STATIC_ASSERT(sizeof(obj) == 1234)

编译器应该输出如下内容:

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

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

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

那么我怎样才能让编译器引发错误或警告只有在sizeof 不符合预期?

【问题讨论】:

    标签: c++ c++98


    【解决方案1】:

    在编译时“显示”值的一种方法是在错误中:

    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&lt;5678ul&gt;

    【讨论】:

    • 谢谢,这就行了!但它在函数内部不起作用,这样会更加一致。
    • 声明(和显式实例化)确实应该进入命名空间范围。在函数范围内,你可以声明变量Debug&lt;sizeof(obj)&gt; d; Issue error if definition is missing
    • 如果您想将检查扩展到多个类,您可能需要更改为 template &lt;typename T, std::size_t N = sizeof(T)&gt; struct Debug;
    猜你喜欢
    • 2011-12-17
    • 2014-01-25
    • 1970-01-01
    • 2018-08-03
    • 2011-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多