我必须用相对较少的行数编写一些包含大量常量的函数。
( 不要理会我写公式的方式,它只是为了表达这样一个事实:我在一个小包中有很多常量,这个具体的例子也很小,在实践中我有一个每个函数最少 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”添加到数字中,使其成为无符号
、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/