我有以下辅助函数:
inline void DebugMessage(const TCHAR* fmtstr, ...)
{
va_list args;
va_start(args, fmtstr);
TCHAR buffer[256];
StringCbVPrintf(buffer, 256, fmtstr, args);
OutputDebugString(buffer);
va_end(args);
}
我这样称呼它两次:
DebugMessage(_T("Test %d\n", 1)); // incorrectly closed _T()
DebugMessage(_T("Test %d\n"), 1); // correctly closed _T()
我得到以下输出:
Test 0
Test 1
第二种情况按预期工作。我很困惑为什么第一种情况完全起作用,而不是错误?
答案 0 :(得分:3)
_T
不是函数,它是(在Unicode构建中)扩展为L ## x
的宏。放错位置的括号不会导致编译错误,它只是改变了宏消耗线的哪些部分。
宏只接受一个参数(x
),因此在第一种情况下,如果关闭不正确,则会丢弃第二个参数(1
),并输出您输出的数字只是堆栈上随机数据的结果。
请注意,默认情况下,VS 2012会针对此发出C4002警告(宏的实际参数太多),因此您可能需要检查是否已正确启用警告。