gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:16:42 25 4
gpt4 key购买 nike

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

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

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

我想要这样的东西:

STATIC_ASSERT(sizeof(obj) == 1234)

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

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

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

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

那么如何让编译器仅当 sizeof 不符合预期时才引发错误或警告?

最佳答案

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

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

错误信息类似于:

error: explicit instantiation of ‘struct Debug<5678ul>’ before definition of template

关于c++ - 在编译时断言 sizeof(obj) 并在不匹配时打印实际大小 (c++98),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56085295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com