文字似乎不能很好地与预处理器宏相互作用。例如,我有这个预处理器定义
CONFIG_FADE_DELAY_MS
,我想将其翻译成std::chrono::milliseconds
。但是 ms
字面量需要紧挨着写,当它们之间有空格时,编译器不理解 ms
。
#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};
您可以使用预处理器的
##
标记连接运算符来加入5000
和ms
标记,例如:
#include <cstdio>
#include <chrono>
#define CONFIG_FADE_DELAY_MS 5000
#define CONCAT2(a, b) a ## b
#define CONCAT(a, b) CONCAT2(a, b)
using namespace std::chrono_literals;
int main()
{
// Works, translates to:
// const auto tp_now = std::chrono::system_clock::now() + 5000ms;
const auto tp_now = std::chrono::system_clock::now() + CONCAT(CONFIG_FADE_DELAY_MS, ms);
}
调用
CONCAT()
的间接CONCAT2()
是必需的,以便预处理器首先将CONFIG_FADE_DELAY_MS
翻译成5000
,然后再将ms
连接到它上面。如果您尝试简单地使用 #define CONCAT(a, b) a ## b
那么结果将不会像预期的那样是 5000ms
而是 CONFIG_FADE_DELAY_MSms
,这显然将无法编译,因为 CONFIG_FADE_DELAY_MSms
没有在任何地方定义。
我的解决方案是使用
std::chrono::milliseconds()
.
举个例子:
#include <cstdio>
#include <chrono>
#define CONFIG_FADE_DELAY_MS 5000
int main()
{
const auto tp_now = std::chrono::system_clock::now() + std::chrono::milliseconds(CONFIG_FADE_DELAY_MS);
}
这只是将数字从整数更改为
std::chrono::duration
,代表毫秒。它也非常明确,这是我喜欢的。