【问题标题】:the identifier __VA_ARGS__ can only appear in the replacement lists of variadic macros标识符 __VA_ARGS__ 只能出现在可变参数宏的替换列表中
【发布时间】:2020-07-22 16:21:58
【问题描述】:

我正在尝试创建一个宏来执行 api 调用。我当前的问题是为调用传递参数。我收到以下错误消息:

标识符 __VA_ARGS__ 只能出现在可变参数宏的替换列表中

#define DO_CALL(api_name)(...) wow64hg::do_call(FNV(#api_name), __VA_ARGS__)

const auto status = DO_CALL(TerminateProcess)(process_handle, 0);

从技术上讲,可以通过使用操作符加载来解决这个问题,但我相信应该有一种方法可以让它像这样保持简单并让它工作。

【问题讨论】:

    标签: c++ macros


    【解决方案1】:

    变量宏语法不能这样工作; ... 必须代表宏的附加参数。宏不能像迭代函数调用那样在单独的括号集中接受多组参数。

    我认为你必须做到以下几点:

    #define DO_CALL(api_name, ...) wow64hg::do_call(FNV(#api_name), __VA_ARGS__)
    
    const auto status = DO_CALL(TerminateProcess, process_handle, 0);
    

    【讨论】:

    • 感谢您的回复。我实际上已经知道了,而且它有效。但是,我们特别希望它采用我的帖子中的格式(api 名称和 args 的括号分开,例如 DO_CALL(api_name)(...))
    • @MemeMachine 我认为您无法仅使用宏来实现这一目标。您可以使用扩展为包含实际调用的 lambda 的宏。 Example.
    • @MilesBudnek 嗯,我明白了。
    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 2014-09-01
    • 2014-03-03
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多