在编译时将整数和小数部分宏组合成一个新的宏或双精度数
Combine integral and fraction part macros into a new macro or a double at compiletime
我在两个预处理器定义中有一个主要版本号和一个次要版本号
#define i 123
#define f 4567
并且需要提供一个函数,将它们 returns 合并为一个双精度值,其中主要数字是整数,次要数字是小数部分。
除了重复这些数字,我能想到的所有解决方案都非常有表现力;在这里查看示例:
https://godbolt.org/z/rg3GyR
如果没有 constexpr,它会变得更具表现力,但也可以做到。
在 MS 世界里,我逃脱了
#define me i.f
double df() { return me; }
但标准 C++ 不提供这种可能性。
我想知道是否存在一种简单的符合标准的方法来做到这一点。
@NathanOliver 关于将事物存储为 double
的精度的评论很重要。但是,如果您想通过将内容存储为显式 double
来继续,您可以使用 token-pasting 运算符和某些级别的宏间接寻址来显式地将所有内容粘合在一起:
#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
来表示您的版本,并让它明确存储主要和次要版本字段。这是对您的想法进行编码的最 "honest" 方式。
将版本打包成一个无符号整数(可能是32位或64位),整数的上半部分是主版本,下半部分是次版本。这允许您使用直接整数运算来比较版本,但也允许您做一些愚蠢的事情,例如乘以版本、按版本修改等等。
一切都使用字符串。这使您可以存储任何长度和任何描述级别的版本。
我在两个预处理器定义中有一个主要版本号和一个次要版本号
#define i 123
#define f 4567
并且需要提供一个函数,将它们 returns 合并为一个双精度值,其中主要数字是整数,次要数字是小数部分。
除了重复这些数字,我能想到的所有解决方案都非常有表现力;在这里查看示例: https://godbolt.org/z/rg3GyR
如果没有 constexpr,它会变得更具表现力,但也可以做到。
在 MS 世界里,我逃脱了
#define me i.f
double df() { return me; }
但标准 C++ 不提供这种可能性。
我想知道是否存在一种简单的符合标准的方法来做到这一点。
@NathanOliver 关于将事物存储为 double
的精度的评论很重要。但是,如果您想通过将内容存储为显式 double
来继续,您可以使用 token-pasting 运算符和某些级别的宏间接寻址来显式地将所有内容粘合在一起:
#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
来表示您的版本,并让它明确存储主要和次要版本字段。这是对您的想法进行编码的最 "honest" 方式。将版本打包成一个无符号整数(可能是32位或64位),整数的上半部分是主版本,下半部分是次版本。这允许您使用直接整数运算来比较版本,但也允许您做一些愚蠢的事情,例如乘以版本、按版本修改等等。
一切都使用字符串。这使您可以存储任何长度和任何描述级别的版本。