如何正确使用 Variadic 宏调用其他宏

How to Correctly use Variadic Macros to Call Other Macros

我知道这不能修复我的构建错误站点,但我已经用尽了所有选项。 None 我的同事可以看出任何错误。

我有一组 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 宏时,不会发生这种情况。

显然,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))