ANSI-C常量表达式函数如C constexpr?
简单来说,有一种ANSI-C方式使函数成为一个常量表达式吗?
>纯ANSI-C但GNU扩展是可以接受的 – 但不是C. 背景: 我需要在没有浮点的嵌入式处理器中实现大量的数学运算,所以我在我的应用程序中使用了固定点. 不过,我不喜欢在我的头文件中看到神秘的常量. 在给定的时刻,我的硬件需要使用这个常量,例如,填写一个计时器重载值,并且,由于值是常量,我想有类似的东西: // Header file. static const int values_table[] = { _Time( 123.45 ),// 123.45 microseconds. // ... }; 然后: // Application source file. int conv_to_timer( x ) { /* my calculations - all const. */ } // ... void my_code( void ) { // ... timer_reload = conv_to_timer( values_table[ index ] ); 一种方法是使我的_Time(x)宏进行定时器值所需的所有计算,但它不灵活(即不能与某些外部相比),既不是便携式的(不同的硬件也需要不同的计算). 有什么优雅方法的建议吗? 解决方法
TL; DR:使用宏.
标准C没有C的constexpr的直接类比.最接近的是宏和内联函数,在这两者中,宏可以在某些方面使用内联函数不能使用 – 特别是,在C需要常量表达式的情况下不能使用内联函数(嗯…听起来类似您知道的任何C关键字?),但宏可以扩展到合适的表达式. constexpr被引入C主要是为了提供宏的替代方法,其中需要一个非平凡但可编译时可计算的表达式.我相信它们也有一些优点,例如它们可以导致在编译时计算的值的类型,但那些似乎与您的特定情况无关.在C中,从未引入constexpr,宏仍然是标准的方法. 您对使用宏的主要反对意见似乎主要与代码风格有关.你观察到C constexpr函数的主体可以在与它的“调用”不同的翻译单元中,这显然对你很有吸引力.但请注意,如果这是您的选择,那么您仍然需要至少在使用它们的翻译单元中声明此类功能,因此您实际上并没有在清洁方面节省太多.此外,尽管每个转换单元必须包含它使用的每个宏的主体,但您仍然可以将宏定义分隔为单独的标头. 总的来说,我不认为避免使用宏 – 如果可以的话 – 会真正获得任何东西.我倾向于认为C社区对宏的普遍厌恶与constexpr一样具有任何功能上的好处.如果碰巧你受到那种特殊厌恶的折磨,那么你真的需要克服它来在标准C中有效地编程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |