【问题标题】:How to return an empty string if __VA_ARGS__ is empty in a C++ macro? [duplicate]如果 __VA_ARGS__ 在 C++ 宏中为空,如何返回空字符串? [复制]
【发布时间】:2021-09-14 08:56:42
【问题描述】:

我有以下宏:

#define MyAssert(condition, ...) CallMyAssertFunctionInCpp(condition, __VA_ARGS__)

__VA_ARGS__char *类型的错误信息,如果__VA_ARGS__为空,我想让它等于""

如何做到这一点?我不确定我可以在宏中做条件,但也许有一个技巧?

【问题讨论】:

  • 如果是 C++ 那么为什么不直接使用模板呢?它更容易和更清洁
  • IIRC 无法使用宏。几乎所有类函数宏的问题都可以通过使用实际函数来解决。比如这个。你可以让一个模板化的重载带参数,一个不带参数。
  • 我必须使用宏来做到这一点
  • 为什么你必须使用宏?你需要用这样的宏解决什么实际和潜在的问题?要求和限制的完整列表是什么?
  • stackoverflow.com/questions/11761703/… 和 0 和 1 个参数的重载。

标签: c++ c-preprocessor


【解决方案1】:

按照 cmets 的建议,使用 C++ 模板很容易实现:

#include <utility>

const char * CallMyAssertFunctionInCpp(bool condition, int arg);

template <typename... T>
const char * MyAssert(bool condition, T... args) {
    if constexpr (sizeof...(T) == 0) {
        return "";
    } else {
        return CallMyAssertFunctionInCpp(condition, std::forward<T>(args)...);
    }
}

void example() {
    MyAssert(true);
    MyAssert(true, 42);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多