文字不适用于预处理器宏

问题描述 投票:0回答:2

文字似乎不能很好地与预处理器宏相互作用。例如,我有这个预处理器定义

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};
c++ preprocessor c++-chrono user-defined-literals
2个回答
3
投票

您可以使用预处理器的

##
标记连接运算符来加入
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
没有在任何地方定义。


1
投票

我的解决方案是使用

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
,代表毫秒。它也非常明确,这是我喜欢的。

© www.soinside.com 2019 - 2024. All rights reserved.