预处理器宏无法与chrono字面值配合使用,如何解决?
预处理器宏与chrono字面值的搭配问题
我定义了预处理器宏CONFIG_FADE_DELAY_MS,希望将其与ms字面值结合转换为std::chrono::milliseconds类型,但宏与ms之间的空格会导致编译器无法识别这个字面值。尝试给宏加括号后紧跟ms也无效,请问有没有办法实现直接搭配字面值的需求,还是必须手动转换为std::chrono::milliseconds{CONFIG_FADE_DELAY_MS}?
示例代码:
#include <cstdio> #include <chrono> #define CONFIG_FADE_DELAY_MS 5000 using namespace std::chrono_literals; int main() { // 可行写法 // const auto tp_now = std::chrono::system_clock::now() + 5000ms; // 不可行写法(宏与ms之间的空格导致识别失败) const auto tp_now = std::chrono::system_clock::now() + CONFIG_FADE_DELAY_MS ms; }
解决方案
使用预处理器连接符
##:
定义一个辅助宏来拼接宏展开后的数值和ms字面值:#define CONFIG_FADE_DELAY_MS 5000 #define MS_LITERAL(x) x##ms using namespace std::chrono_literals; int main() { const auto tp_now = std::chrono::system_clock::now() + MS_LITERAL(CONFIG_FADE_DELAY_MS); }##是预处理器的token连接符,会把CONFIG_FADE_DELAY_MS展开后的5000和ms直接拼接成5000ms,让编译器能够正确识别为chrono字面值。直接在宏中定义字面值:
如果场景允许,直接把宏定义为带字面值的形式,使用时更简洁:#define CONFIG_FADE_DELAY 5000ms using namespace std::chrono_literals; int main() { const auto tp_now = std::chrono::system_clock::now() + CONFIG_FADE_DELAY; }手动构造chrono对象(最稳妥):
就是你提到的手动转换方式,这种写法可读性强,避免预处理器带来的潜在问题,尤其适合复杂的宏场景:const auto tp_now = std::chrono::system_clock::now() + std::chrono::milliseconds{CONFIG_FADE_DELAY_MS};
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

