j4x*_*j4x 3 c const c++11 ansi-c
简单来说,有一种ANSI-C方式使函数成为一个常量表达式吗?
constexpr并且不会在运行时解决.背景:
我需要在没有浮点的嵌入式处理器中实现大量的数学运算,所以我在我的应用程序中使用了固定点.
不过,我不喜欢在我的头文件中看到神秘的常量.我的硬件需要几个浮点常量(例如130.7 microseconds,0.2503 mJ),我真的希望能够读取(其他城市)我的常量数据表值列的部分.
在给定的时刻,我的硬件需要使用这个常量,例如,填写一个计时器重载值,并且,由于值是常量,我想有类似的东西:
// Header file.
static const int values_table[] =
{
_Time( 123.45 ), // 123.45 microseconds.
// ...
};
Run Code Online (Sandbox Code Playgroud)
然后:
// Application source file.
int conv_to_timer( x ) { /* my calculations - all const. */ }
// ...
void my_code( void )
{
// ...
timer_reload = conv_to_timer( values_table[ index ] );
Run Code Online (Sandbox Code Playgroud)
一种方法是让我的_Time( x )宏进行计时器值所需的所有计算,但它不灵活(即不能与某些外部相比),既不是便携式(不同的硬件也需要不同的计算).
有什么优雅方法的建议吗?
TL; DR:使用宏.
标准C没有C++的直接类比constexpr.最接近的是宏和内联函数,在这两者中,宏可以在某些方面使用内联函数不能使用 - 特别是,在C需要常量表达式的情况下不能使用内联函数(嗯...听起来类似对于你知道的任何C++关键字?),但另一方面,宏可以扩展为合适的表达式.
constexpr被引入C++主要是为了提供宏的替代方法,其中需要一个非平凡但可编译时可计算的表达式.我相信它们也有一些优点,例如它们可以导致在编译时计算的值的类型,但那些似乎与您的特定情况无关.在C中,constexpr从未引入过,宏仍然是标准的方法.
您对使用宏的主要反对意见似乎主要与代码风格有关.您观察到C++ constexpr函数的主体可以在与"调用"不同的转换单元中,这显然对您有吸引力.但请注意,如果这是您的选择,那么您仍然需要至少在使用它们的翻译单元中声明此类功能,因此您实际上并没有在清洁方面节省太多.此外,尽管每个转换单元必须包含它使用的每个宏的主体,但您仍然可以将宏定义分隔为单独的标头.
总的来说,我不认为避免使用宏 - 如果可以的话 - 会真正获得任何东西.我倾向于认为C++社区对宏的普遍厌恶constexpr与任何功能上的好处一样大.如果碰巧你受到那种特殊厌恶的折磨,那么你真的需要克服它来在标准C中有效地编程.
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |