字面量看起来和预处理器宏的交互效果不太好。例如,我有一个预处理器定义CONFIG_FADE_DELAY_MS
,我想把它翻译成std::chrono::milliseconds
。但是ms
字面量需要写得离它很近,当它们之间有一个空格时,编译器就不能理解ms
。
Demo
#include <cstdio>
#include <chrono>
#define CONFIG_FADE_DELAY_MS 5000
using namespace std::chrono_literals;
int main()
{
// Works
// const auto tp_now = std::chrono::system_clock::now() + 5000ms;
// Doesn't work
const auto tp_now = std::chrono::system_clock::now() + CONFIG_FADE_DELAY_MS ms;
}
我也试着在预处理器宏的周围加上括号,并把文字放在它的后面,但是没有成功。
可以这样做吗?还是需要手动转换宏?
std::chrono::milliseconds{CONFIG_FADE_DELAY_MS};
2条答案
按热度按时间zte4gxcn1#
您可以使用预处理器的
##
标记串联运算符来连接5000
和ms
标记,例如:Demo
CONCAT()
调用CONCAT2()
的间接性是必需的,以便预处理器首先将CONFIG_FADE_DELAY_MS
转换为5000
,然后再将ms
连接到5000
上。如果尝试简单地使用#define CONCAT(a, b) a ## b
,则结果将不是预期的5000ms
,而是CONFIG_FADE_DELAY_MSms
。由于CONFIG_FADE_DELAY_MSms
没有在任何地方定义,因此显然不能编译。bihw5rsg2#
我的解决方案是使用
std::chrono::milliseconds()
。下面是一个例子:
这只是将数字从整数更改为
std::chrono::duration
,表示ms。它也非常明确,这是我喜欢的。