加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ANSI-C常量表达式函数如C constexpr?

发布时间:2020-12-16 10:07:23 所属栏目:百科 来源:网络整理
导读:简单来说,有一种ANSI-C方式使函数成为一个常量表达式吗? 纯ANSI-C但GNU扩展是可以接受的 – 但不是C. 最好不依赖于宏. 肯定会像C constexpr一样的东西,并且不会在运行时解决. 背景: 我需要在没有浮点的嵌入式处理器中实现大量的数学运算,所以我在我的应用
简单来说,有一种ANSI-C方式使函数成为一个常量表达式吗?

>纯ANSI-C但GNU扩展是可以接受的 – 但不是C.
>最好不依赖于宏.
>肯定会像C constexpr一样的东西,并且不会在运行时解决.

背景:

我需要在没有浮点的嵌入式处理器中实现大量的数学运算,所以我在我的应用程序中使用了固定点.

不过,我不喜欢在我的头文件中看到神秘的常量.
我的硬件需要几个浮点常数(例如130.7微秒,0.2503 mJ),我真的希望能够读取(和更改)我的常量,因为列出了部件数据表值.

在给定的时刻,我的硬件需要使用这个常量,例如,填写一个计时器重载值,并且,由于值是常量,我想有类似的东西:

// 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中有效地编程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读