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

标签 c++ c

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

( 不要理会我写公式的方式,它只是为了表达这样一个事实:我在一个小包中有很多常量,这个具体的例子也很小,在实践中我有一个每个函数最少 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/

相关文章:

c++ - 一个函数可以返回超过 1 个变量/结构/vector 吗?

c++ - 如何在修改设计时停止现有代码基类的实例创建?

c - math.h 和角度函数的 undefined reference

c - 打印二叉搜索树范围内的总和

c - 通过引用将局部结构传递给另一个函数

c++ - 静态函数内部的动态内存分配

c++ - 调试霍纳规则程序

java - Pollard rho 整数分解

c - 如何将Lua中的递归函数翻译成C

c++ - 即使在混合后也想要透明图像