为什么这个带有TCHAR和可变参数的代码会有这种行为

Why does this code with TCHAR and variadic arguments behave this way?

本文关键字:代码 参数 TCHAR 为什么 变参      更新时间:2023-10-16

我有以下助手函数:

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 %dn", 1)); // incorrectly closed _T()
DebugMessage(_T("Test %dn"), 1); // correctly closed _T()

我得到以下输出:

Test 0
Test 1

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

_T不是一个函数,它是一个(在Unicode构建中)扩展到L ## x的宏。放错位置的括号不会导致编译错误,它只会更改宏使用的行的哪些部分。

宏只接受一个参数(x),因此在第一种情况下,使用不正确的闭包,第二个参数(1)将被丢弃,并且您在输出中得到的数字只是堆栈上随机数据的结果。

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