为什么这个带有TCHAR和可变参数的代码会有这种行为
Why does this code with TCHAR and variadic arguments behave this way?
我有以下助手函数:
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警告(宏的实际参数过多),因此您可能需要检查是否正确启用了警告。
相关文章:
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 根据编译时参数在 C 中重复代码
- 扩展C++生成的代码的模板参数类型名称
- 将函数作为参数传递以避免重复代码
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++基于输入参数的动态代码生成
- 调用参数不是原子参数的函数是此代码引发异常的原因吗?
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- C++17.处理使用 auto 相关的模板参数.代码排序困难
- 为什么EclipseCDT代码格式化程序有时会在模板参数中引入空格
- 我写了一个类,它总是将其函数参数委托给它的成员,我该如何改进代码
- 编译器是否C++具有相同模板参数集的每个模板类实例生成代码?
- 如何将char数组声明为函数参数?或告诉我此代码中还有其他问题?
- 我的代码在作为参数传入 .begin() 时不起作用,但在我将 .begin() 转换为迭代器后工作
- 如何基于构造函数参数模板化类成员函数的代码
- 在存在错误代码的情况下输出参数与 NRVO
- 在完美转发函数中公开参数类型,避免代码重复
- 中断长代码 snprintf 格式和参数
- 将代码移出类定义时未扩展参数包