c++ - 将对象传递给 var arg 函数

标签 c++ mfc cstring

变量参数函数如何将对象带入结构/类? 例如:

CString a_csName;
CString a_csAge(_T("20"));
a_csName.Format(_T("My Age is : %s"),a_csAge);

这里的 CString::Format 是一个 printf 风格的变量参数函数,它接受这个 CString 对象。这怎么可能?

最佳答案

通过 MFC 代码进行一些研究和调试后发现以下内容,希望它能帮助遇到著名的静态代码分析器错误“将结构‘CStringT’传递给省略号”的人,这实际上也是我怀疑的根源。

http://www.gimpel.com/html/bugs/bug437.htm

格式函数是可变参数函数,取决于第一个参数中存在的格式说明符。第一个参数始终是一个 char *。

它解析格式说明符 (%s,%d,%i...) 并根据找到的格式说明符的索引读取 var_arg 数组,并直接转换为 char * if %s 或 int if %d被指定。

因此,如果指定了 CString 并且相应的格式说明符是 %s,那么将在 CString 对象上直接尝试转换为 char *。

CString a_csName;
CString a_csAge(_T("20"));
a_csName.Format(_T("My Age is : %s"),a_csAge);
wcout<<a_csName;

将打印我的年龄是 20

CString a_csName;
CString a_csAge(_T("20"));
a_csName.Format(_T("My Age is : %d"),a_csAge);
wcout<<a_csName;

将打印我的年龄是 052134

所以这背后没有智能。只是直接 Actor 。因此,我们传递 POD 或用户定义的数据结构并没有什么区别。

关于c++ - 将对象传递给 var arg 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14709252/

相关文章:

c++ - x86上的原子性

c++ - 检查真值上下文中的空指针

c++ - 在 MFC 中重绘时闪烁

c++ - 使用_variant_t.bstrVal将_variant_t转换为CString或显示在("%s"时会出现差异

c - 写入 c 字符串

c++ - 将 CString 转换为字符数组?

c++ - 是否可以从 Visual Studio 2017 创建 Linux 共享库?

c++ - 我无法使用 RegOpenKeyEx

windows - 如何更改自定义打印对话框属性

c++ - 从 mfc、sdi 中的对话框类访问文档文件