问题标签 [static-assert]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
20067 浏览

c - 在 C 中构建时断言表达式的方法

我正在整理一些旧代码,这些代码到处使用“幻数”来设置硬件寄存器,我想使用常量而不是这些数字来使代码更具表现力(实际上它们会映射到名称/values 用于记录寄存器)。

然而,我担心随着变化的数量,我可能会打破神奇的数字。这是一个简化的示例(寄存器集更复杂):

所以而不是:

我们有:

我正在寻找的是构建时版本:

更新

@Christian,感谢您的快速响应,我也对 C / 非增强环境的答案感兴趣,因为这是驱动程序/内核代码。

0 投票
4 回答
598 浏览

c++ - 想要:一个 C++ 模板想法来解决问题,但在编译时?

我们有一个 const 结构数组,如下所示:

static const SettingsSuT _table[] = { {5,1}, {1,2}, {1,1} 等 };

该结构具有以下内容:

  • 大小字节:
  • 数量:
  • 其他“元数据”成员

所以“总大小”是单个元素的 size_bytes*num_items 。所有这些信息都在 const 数组中,在编译时可用。但是,请注意,_table 的总大小与 EEPROM 本身的大小无关。_table 不镜像 EEPROM,它只描述了布局、使用和其他我们需要的“元数据”类型信息。但是,您可以使用此元数据来确定我们正在使用的 EEPROM 数量。

该数组仅描述了存储在具有固定/最大大小的外部 EEPROM 中的数据。随着功能的添加和删除, const 数组中的条目会发生变化。我们目前对数据的总大小进行运行时检查,以确保它不超过 EEPROM 大小。

但是,我们已经将其中许多运行时检查更改为 static_assert 样式的模板检查,以便立即停止构建。我不是模板专家,所以可以在这方面使用一些帮助。

所以,问题是:如何创建一个模板来将所有元素的大小相加(将每个元素的值相乘,然后将所有结果相加),然后执行 static_assert 并在它们超过幻数大小时停止构建的 EEPROM。我将典型的递归阶乘模板示例作为一种方法,但它无法访问数组,它需要一个 const 值(我认为)。

非常感谢您的帮助,

0 投票
2 回答
231 浏览

c++ - 如何静态断言许多类的共同属性

假设我有 3 节课。我希望每个类的 sizeof() 完全相同——比如 512 个字节。

我怎样才能使用类似的东西BOOST_STATIC_ASSERT适用于所有这些,这样

  1. 我只需要BOOST_STATIC_ASSERT在一个地方使用(DRY原则)
  2. 在编译时而不是运行时评估一次

注意:我们可以使用我们想要的任何 C++ 技术(创建更多类、使用继承等)

我的幼稚解决方案如下所示:

0 投票
8 回答
22442 浏览

c++ - GCC 有内置的编译时断言吗?

我们现有的编译时断言实现基于负数组索引,它在 GCC 上提供了较差的诊断输出。C++0xstatic_assert是一个非常好的特性,它提供的诊断输出要好得多。我知道 GCC 已经实现了一些 C++0x 特性。有谁知道是否static_assert在其中,如果它是从什么 GCC 版本开始的?

0 投票
8 回答
74124 浏览

c++ - static_assert 有什么作用,你会用它做什么?

你能举一个例子,static_assert(...)('C++11') 可以优雅地解决手头的问题吗?

我熟悉运行时assert(...)。我什么时候应该static_assert(...)比常规更喜欢assert(...)

另外,在boost有一个东西叫做BOOST_STATIC_ASSERT,它和 一样static_assert(...)吗?

0 投票
6 回答
5999 浏览

c - 带有常量数组的 C 编译时断言

我有一个在编译时初始化的非常大的常量数组。

我想验证数组是否已正确初始化,例如:

我的问题是我想在编译时验证这一点。我在这个线程中阅读了 C 中的编译时断言:C Compiler asserts。但是,那里提供的解决方案建议使用负值定义一个数组作为编译错误的大小:

并使用:

提供的解决方案对我不起作用,因为我需要验证我的常量数组值,并且 C 不允许使用常量数组值初始化数组:

有什么办法吗?其他一些编译时断言?

0 投票
6 回答
9506 浏览

c++ - BOOST_STATIC_ASSERT 没有升压

由于在我工作的公司中禁止使用 boost,因此我需要在纯 C++ 中实现其功能。我已经研究了提升源,但它们似乎太复杂而无法理解,至少对我来说是这样。我知道static_assert()C++0x 标准中有一些东西,但我不想使用任何 C++0x 功能。

0 投票
6 回答
5412 浏览

c++ - 常量变量的静态断言?

静态断言对于在编译时进行检查非常方便。一个简单的静态断言习惯用法如下所示:

这对像这样的东西有好处

和:

但是 using#define不是定义常量的“C++”方式。C++ 会让你使用匿名命名空间:

甚至:

这样做的问题是,const int你不能使用a STATIC_ASSERT(),你必须求助于运行时检查,这很愚蠢。

有没有办法在当前的 C++ 中正确解决这个问题?
我想我读过 C++0x 有一些工具可以做到这一点......


编辑

好的,所以这个

编译得很好
但是这个:

才不是。
(在 Visual Studio 2008 中)

怎么会?

0 投票
3 回答
4020 浏览

c++ - 用消息提升 static_assert?

在 1.43 boost 上,似乎 BOOST_STATIC_ASSERT 只允许放置一个布尔值,是否有一些替代方法可以让我在编译错误时也显示一条消息?

0 投票
13 回答
96832 浏览

c - C中的静态断言

在 C(不是 C++)中实现编译时静态断言的最佳方法是什么,特别强调 GCC?