为什么带有TCHAR和可变参数的代码会以这种方式运行?

时间:2013-09-03 02:42:30

标签: c++ variadic

我有以下辅助函数:

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

第二种情况按预期工作。我很困惑为什么第一种情况完全起作用,而不是错误?

1 个答案:

答案 0 :(得分:3)

_T不是函数,它是(在Unicode构建中)扩展为L ## x的宏。放错位置的括号不会导致编译错误,它只是改变了宏消耗线的哪些部分。

宏只接受一个参数(x),因此在第一种情况下,如果关闭不正确,则会丢弃第二个参数(1),并输出您输出的数字只是堆栈上随机数据的结果。

请注意,默认情况下,VS 2012会针对此发出C4002警告(的实际参数太多),因此您可能需要检查是否已正确启用警告。