【发布时间】:2016-05-13 04:44:36
【问题描述】:
如果我想在小型处理器嵌入式设计中断言从 C++11 constexpr 函数检测到的错误,则关闭中断会取消处理错误的建议方法(请参阅 eric nieblers 回答 here)
这是一个简短的代码示例:
constexpr bool isANumber(char c)
{
return (c >= '0' && c <= '9');
}
constexpr int charToInt(char c)
{
return (!isANumber(c))? throw std::logic_error("not a number"):
c - '0';
}
据我所知:
- 不允许使用static_assert,因为输入可能是运行时值
- assert 可能会强制对函数进行运行时评估,并且 assert 处理程序会拖入太多东西,以至于它会溢出大多数 Cortex 芯片的闪存
- throw 不起作用,因为我关闭了异常
解决方法是什么?
注意:在超级资源受限的嵌入式环境中使用 C++ 必须关闭异常,因为它们使用过多的 RAM(例如,我的芯片只有 16K RAM)。这是常见的做法。
【问题讨论】:
-
在 C++14 中,你可以在
constexpr函数中使用assert。 -
@101010 感谢您的评论,不过我在 C++11 上需要它,将其添加到我的问题中
-
@columbo 感谢您的链接,看来我的问题可能是重复的
-
看起来 assert 也不是一个选项,因为 GCC 断言将太多东西拖入二进制文件中,我无法在大多数 ARM Cortex 芯片上使用
标签: c++ c++11 exception metaprogramming constexpr