如何正确使用 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))
我知道这不能修复我的构建错误站点,但我已经用尽了所有选项。 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))