在编译时将整数和分数部分宏组合成一个新的宏或双精度
Combine integral and fraction part macros into a new macro or a double at compiletime
我有两个预处理器定义中提供的主要版本号和次要版本号
#define i 123
#define f 4567
并且需要提供一个函数,将它们组合为双精度值返回,其中主数是整数,次要数是小数部分。
除了重复这些数字之外,我能想到的所有解决方案都非常富有表现力;例如,请参阅此处: https://godbolt.org/z/rg3GyR
如果没有 constexpr,它会变得更有表现力,但也可以做到。
在MS世界中,我侥幸逃脱了
#define me i.f
double df() { return me; }
但标准C++没有提供这种可能性。
我想知道是否存在一种简单的标准一致性方法来做到这一点。
@NathanOliver关于将事物存储为double
的精度的评论很重要。但是,如果要继续将内容存储为显式double
,则可以使用令牌粘贴运算符和某些级别的宏间接寻址将所有内容显式粘合在一起:
#define MAJOR 123
#define MINOR 4567
/* Two macro levels are necessary here so that the arguments MAJOR
* and MINOR get expanded out to their true values.
*/
#define GLUE2(a, b) a##.##b
#define GLUE(a, b) GLUE2(a, b)
/* Now, VERSION is the constant 123.4567. Or at least, the closest
* approximation of that value using a double.
*/
#define VERSION GLUE(MAJOR, MINOR)
其他可能更适合您的选项:
创建一个
struct
来表示您的版本,并让它显式存储主要版本和次要版本字段。这是编码你的想法的最"诚实"的方式。将版本打包到无符号整数(可能是 32 位或 64 位)中,其中整数的上半部分是主要版本,下半部分是次要版本。这允许您使用直接整数运算比较版本,但也允许您做一些愚蠢的事情,例如乘以版本、按版本修改等。
对所有内容都使用字符串。这使您可以存储任何长度和任何描述级别的版本。
相关文章:
- 将双精度变量设置为另一个变量的值
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- C++ 警告:在一个声明中将截断从双精度初始化为浮点数,但在另一个声明中则不初始化
- 字符串和双精度的麻烦,等值后再得到一个数字
- 我想读取文本文件中的所有内容(但文本文件中只有一个双精度值),转换为双精度值并返回值
- 在编译时将整数和分数部分宏组合成一个新的宏或双精度
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 有没有办法构造一个 constexpr 函数来获取双精度的位表示
- C++ 传递一个 int,错误地说这是一个双精度
- 在C++中获取大于或等于一个双精度的最小浮点值(以及小于或等于一的最大浮点值)
- 在字符串(C++)的末尾添加一个双精度
- C++试图返回一个双精度数组的字符串(有点)
- 如何找到最近的下一个/上一个双精度值(给定数字的numeric_limits::epsilon)
- C++函数在一个双精度数组中查找最大值
- 两个整型到一个双精度c++
- 如何用代数工具创建一个双精度矩阵
- 当我从函数返回一个双精度值时,它变成了一个整数
- 在程序中稍后传递一个双精度-使用对话框进行输入