gpt4 book ai didi

c++ - 重载 C 宏

转载 作者:IT老高 更新时间:2023-10-28 21:36:58 28 4
gpt4 key购买 nike

有没有更好的方法来“重载”这样的宏?我需要一个接受不同数量参数的宏。

#define DEBUG_TRACE_1(p1) std::string p[] = {p1}; log _log(__FUNCTION__, p, 1)
#define DEBUG_TRACE_2(p1, p2) std::string p[] = {p1, p2}; log _log(__FUNCTION__, p, 2)
#define DEBUG_TRACE_3(p1, p2, p3) std::string p[] = {p1, p2, p3}; log _log(__FUNCTION__, p, 3)
#define DEBUG_TRACE_4(p1, p2, p3, p4) std::string p[] = {p1, p2, p3, p4}; log _log(__FUNCTION__, p, 4)
#define DEBUG_TRACE_5(p1, p2, p3, p4, p5) std::string p[] = {p1, p2, p3, p4, p5}; log _log(__FUNCTION__, p, 5)

这样称呼

DEBUG_TRACE_2("more", "params");

最佳答案

执行特定示例的最简单方法是使用可变参数宏:

#define DEBUG_TRACE(...)                                        \
do { \
std::string p[] = { __VA_ARGS__ }; \
log _log(__FUNCTION__, p, (sizeof p) / (sizeof p[0])); \
} while (0)

几个注意事项:

  1. __VA_ARGS__ 是提供给宏的逗号分隔参数列表的名称
  2. 您可以使用 sizeof 找出您的情况有多少,因为 p 是一个静态数组
  3. 在 do..while 中围绕宏代码通常被认为是一种很好的做法,因为它为变量 (p) 提供了 block 作用域,因此用户仍然可以在宏之外拥有同名的变量,而 while (0) 部分很好if 语句之后接受分号而不换行

如果您需要比这更大的灵 active ,您可以使用一个非常巧妙的技巧,让您显式地“重载”宏,使其在不同数量的参数下表现完全不同。但是,这会使代码更加复杂,只有在绝对必要时才应该使用。由于看起来可变参数对您的用例来说很好,我将只提供一个链接: http://efesx.com/2010/07/17/variadic-macro-to-count-number-of-arguments/

关于c++ - 重载 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8886812/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com