【发布时间】: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