0

我有以下辅助功能:

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

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

4

1 回答 1

3

_T不是一个函数,它是一个宏(在 Unicode 版本中)扩展为L ## x. 放错位置的括号不会导致编译错误,它只是更改宏消耗的行的哪些部分。

宏只接受一个参数 ( x),因此在第一种情况下,由于闭包不正确,第二个参数 ( 1) 会被简单地丢弃,而您在输出中获得的数字只是堆栈上随机数据的结果。

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

于 2013-09-03T03:02:25.927 回答