【问题标题】:How to Correctly use Variadic Macros to Call Other Macros [duplicate]如何正确使用可变参数宏调用其他宏[重复]
【发布时间】:2019-12-13 19:43:02
【问题描述】:

我知道这不能修复我的构建错误站点,但我已经用尽了所有选择。我的同事都看不出有什么问题。

我有一组 EventWriteQuic* 格式的宏,并采用可变数量的参数。例如:

#define EventWriteQuicLibraryInitialized(PartitionCount, DatapathFeatures) \
        MCGEN_EVENT_ENABLED(QuicLibraryInitialized) \
        ? McTemplateU0qq(&MICROSOFT_MSQUIC_PROVIDER_Context, &QuicLibraryInitialized, PartitionCount, DatapathFeatures) : 0

然后我尝试像这样定义自己的宏:

#define QuicTraceEvent(Name, ...) EventWriteQuic##Name(__VA_ARGS__)

最后,我像这样调用我的宏:

    QuicTraceEvent(LibraryInitialized,
        MsQuicLib.PartitionCount,
        QuicDataPathGetSupportedFeatures(MsQuicLib.Datapath));

由于某种原因,我收到以下构建警告:

.\core\library.c(192,1): warning C4003: not enough arguments for function-like macro invocation 'EventWriteQuicLibraryInitialized'

我得到的最后一点信息是,对于不带参数的 EventWriteQuic* 函数,上面的代码似乎工作得很好,这让我觉得这有点忽略了我的 __VA_ARGS__

编辑:

使用/P标志时产生的输出:

((((const unsigned char*)Microsoft_QuicEnableBits)[0 >> 3] & (1u << (0 & 7))) != 0) ? McTemplateU0qq_EventWriteTransfer(&MICROSOFT_MSQUIC_PROVIDER_Context, &QuicLibraryInitialized, MsQuicLib.PartitionCount, QuicDataPathGetSupportedFeatures(MsQuicLib.Datapath), ) : 0;

由于某种原因,它似乎在末尾添加了一个额外的逗号。当我直接调用EventWriteQuicLibraryInitialized 宏时,不会发生这种情况。

【问题讨论】:

  • @jxh 我已经用输出更新了帖子。
  • @jxh 我不清楚这如何解决我的问题。我不接受两个论点然后...
  • @Nick 你能重写你的代码,让它不使用我们看不到的 ayn 函数吗?当我用虚拟函数替换未知函数时,我无法得到你得到的编译错误。
  • 这是一个很好的例子:godbolt.org/z/MFdhzp(更新)
  • 这里有一个修复:godbolt.org/z/-N955d

标签: c visual-c++ c-preprocessor variadic-macros


【解决方案1】:

显然,MSVC 有一个错误,不允许它直接将__VA_ARGS__ 成功传递给另一个宏。

对我来说失败的样本是:

#define A(X, ...) A_##X(__VA_ARGS__)
#define A_TEST(A, B) ((A)+(B))

printf("%d\n", A(TEST, 1, 2));

但是,如果我将 __VA_ARGS__ 括在括号中,则内容将被视为单个参数。我可以将它传递给另一个宏来实际执行调用,它可以工作。

#define A(X, ...) A_(X, (__VA_ARGS__))
#define A_(X, Y) A_##X Y
#define A_TEST(A, B) ((A)+(B))

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 2023-04-11
    • 2016-12-13
    • 2018-01-13
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多