c++ 文字不适用于预处理器宏

l3zydbqr  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(130)

字面量看起来和预处理器宏的交互效果不太好。例如,我有一个预处理器定义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};
zte4gxcn

zte4gxcn1#

您可以使用预处理器的##标记串联运算符来连接5000ms标记,例如:

#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);
}

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没有在任何地方定义,因此显然不能编译。

bihw5rsg

bihw5rsg2#

我的解决方案是使用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,表示ms。它也非常明确,这是我喜欢的。

相关问题