gpt4 book ai didi

c++ - 如何表达常量的类型?

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:35 25 4
gpt4 key购买 nike

我必须在相对较少的行中编写一些包含大量常量的函数。

( 不要在意我写公式的方式,它只是简单地表达了一个事实,即我在一个小包中有很多常量,这个具体的例子也很小,实际上我有一个每个函数至少有 6-7 个常量)

T foo( T x )
{
return k1 * k2 * x - k3;
}

假设我对将常量声明为静态不感兴趣(在我的特定情况下它也会导致命名约定出现问题)const T k1 = 42;,我想找到一个替代方案。

一个可行的替代方案是

T foo( T x )
{
return uint32_t{42} * uint32_t{21} * x - uint32_t{33};
}

目前主要有两个问题:

  • 我不确定这种声明是否会创建一个完整的对象或只是“一个数字”
  • 这是一个仅限 C++ 的解决方案,我正在编写应该与 C99+ 兼容的非常简单的函数。

我为什么要这样做?

很简单,这个常量的值是高度可变的,非常小的值或大的值,非常小的值会浪费大量空间,而且这个常量是数学常量,所以它们永远不会改变,我可以优化此部分从第一个版本开始。

还有另一个方面,数字常量的默认类型是有符号整数,我想选择任意大小的无符号整数类型。

在函数外静态声明const T k1 = 42;的问题在于,不同的常量同名,常量的值因函数不同而不同,但是从数学上讲,常量的名称是相同的,因此使用此解决方案,我最终将在同一范围内对同一变量进行多次声明。这就是为什么我不能使用名称或此类声明的原因。

你有没有想过用一种同时兼容 C++ 和 C 的方式来编写它?

最佳答案

在 C 中,对于整数,您可以将 'U'、'L' 或 'LL' 添加到数字中以使其成为 unsignedlong long long 几种组合

a = -1LL;  // long long
b = -1U; // unsigned
c = -1ULL; // unsigned long long
d = -1LLU; // unsigned long long
e = -1LU; // unsigned long
f = -1UL; // unsigned long

C 中的另一个选项是强制转换。编译器很可能会做正确的事情:)

return (uint32)42 - (int64)10;

但可能是最好的选择,正如 ouah 所指出的那样在下面的评论中,是对整数常量使用宏(C99 Standard 7.18.4)

a = UINT32_C(-1); // -1 of type uint_least32_t
b = INT64_C(42); // 42 of type int_least64_t

关于c++ - 如何表达常量的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23660950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com