printf 如何知道 CString 字符数据的地址?

2024-01-05

考虑这个代码片段:

struct My {
  operator const char*()const{ return "my"; }
} my;

CStringA s( "aha" );
printf("%s %s", s, my );


// another variadic function to get rid of comments about printf :)
void foo( int i, ... ) {
  va_list vars;
  va_start(vars, i);
  for( const char* p = va_arg(vars,const char*)
     ; p != NULL
     ; p=va_arg(vars,const char*) ) 
  {
    std::cout << p << std::endl;
  }
  va_end(vars);
}
foo( 1, s, my );

该代码片段会产生“直观”的输出“aha”。但我不知道这是如何工作的:

  • 如果可变参数函数调用被转换为推送参数的指针,printf 将收到一个CStringA*这被解释为const char*
  • 如果可变参数函数调用正在调用operator (const char*)就它而言,为什么我自己的班级不这样做呢?

有人可以解释一下吗?

编辑:添加了一个虚拟变量函数,将其参数视为const char*s。看吧 - 当它到达时它甚至崩溃了my争论...


C++98标准§5.2.2/7的相关文本:

左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换是对参数表达式执行的。在这些转换之后,如果参数没有算术、枚举、指针、成员指针或类类型,则程序格式错误。如果参数具有非 POD 类类型(第 9 条),则行为未定义。

So 正式行为是未定义的.

然而,给定的编译器可以提供任意数量的语言扩展,而 Visual C++ 就是如此。这MSDN 库 http://msdn.microsoft.com/en-us/library/z11y6be4.aspx记录 Visual C++ 的行为,如下所示,将参数传递给...:

  • 如果实际参数的类型为 float,则在函数调用之前将其提升为 double 类型。
  • 任何有符号或无符号 char、短整型、枚举类型或位字段都会使用整数提升转换为有符号或无符号 int。
  • 类类型的任何参数都作为数据结构按值传递;该副本是通过二进制复制而不是通过调用类的复制构造函数(如果存在)创建的。

这没有提到任何有关 Visual C++ 应用用户定义的转换的内容。

MS CString是“巧妙”布局的,因此它的 POD 表示正是指向其以 null 结尾的字符串的指针。 (sizeof(CStringA) == sizeof(char*)) 当它用于anyprintf 风格的函数该函数刚刚获取传递的字符指针。

所以这是有效的,因为上面的最后一点和方式CString已布置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

printf 如何知道 CString 字符数据的地址? 的相关文章

随机推荐

  • 使用 LINQ to SQL 时这是一个虚假警告吗?

    根据我见过的许多 LINQ 示例 我正在使用类似于以下代码的代码创建自己的数据上下文和表 class MyDatabase DataContext public Table
  • 将 IIS 应用程序池回收事件记录在 Windows 事件日志中

    我想得到IIS 7应用程序池回收 启动 停止等事件要记录到Windows事件日志 我按照中概述的步骤操作本文 http www iisadmin co uk p 17但没有取得任何成功 我重新启动了应用程序池 事件日志中没有记录任何内容 我
  • CloudWatch 自定义指标未按预期工作

    我已经根据发送到 CloudWatch 的一些日志文件创建了 7 个其他指标 没有出现任何问题 前段时间我们遇到了 MongoDB 连接问题 我通过日志发现了这个问题 所以我想创建一个 Metric 以便我可以基于它创建一个 Alarm 我
  • 带有 Plastic SCM 的超大型存储库

    我们正在研究 Plastic SCM 作为 Subversion 的可能替代方案 用于我们产品的版本控制 除了非常庞大的源代码库之外 我们还拥有大量的二进制资产 主要是艺术资产 还包括一些文档 AVI 等 简单说一下 svn 检查我们的 t
  • 变长系列

    我试图确定是否可以在 Excel 中编写以下计算 其中 n 是变量并且来自用户输入 n的值是正数并且等于或大于1 是否可以写一个公式而不是使用vba 2 1 2 2 2 3 2 n If n 1 then the calculation w
  • JavaFX:对单击、双击和三次单击的反应

    我正在尝试配置某些操作来响应鼠标单击次数 在我看来 单击和三次单击被检测到并应用 但双击实际上不起作用 我尝试做类似的事情 if doubleClick else if tripleClick else if singleClick 检查顺
  • 使用 CGAffineTransform 倾斜 UIImageView

    我试图倾斜一个矩形 使两个垂直边倾斜但平行 顶部和底部是水平的 我正在尝试使用 CGAffineTransform 并找到了这段代码 但我不知道要在各个部分中放入什么 imageView layer somethingMagic image
  • 如何取消自定义等待

    我读了斯蒂芬 图布的博客 https devblogs microsoft com pfxteam awaiting socket operations 关于为 SocketAsyncEventArgs 制作自定义等待 这一切都很好 但我需
  • Keyvault 身份验证(REST API)

    我对微软分散的文档有点困惑 我创建了一个应用程序 https learn microsoft com en us azure azure resource manager resource group create service prin
  • 在SOLID中,SRP和ISP有什么区别? (单一职责原则和接口隔离原则)

    如何SOLID http en wikipedia org wiki Solid object oriented design 接口隔离原则 与 单一职责原则 有何不同 维基百科SOLID 条目说 http en wikipedia org
  • UIStackView 中的多行标签

    将多行标签 换行符设置为自动换行 放入堆栈视图时 标签会立即丢失换行符并在一行中显示标签文本 为什么会发生这种情况以及如何在堆栈视图中保留多行标签 正确答案在这里 https stackoverflow com a 43110590 566
  • cocoa 再次错误 134100 - (用于打开的模型与用于创建的模型不兼容...)

    我在这里看到了这个问题 但总是 答案是模型已更改 重置模拟器 删除商店 我也收到此错误 但是 这是一个新应用程序 我没有添加 更改实体或属性 我删除了商店 重置了模拟器 但得到了相同的结果 这是商店代码 这个问题还有其他原因吗 NSMana
  • jQuery:分离并重新附加元素而不重新加载内容

    我想知道是否可以使用 jQuery 分离然后将元素 例如 div 重新附加到 DOM 而无需重新加载元素内的内容 考虑这个示例布局 div class row div class col lg 6 div class card img sr
  • 如何在执行剧本时在命令行中添加多个清单文件

    我有一本包含两种不同玩法的剧本 Sample yml name Play1 hosts Host1 tasks name Play2 hosts Host2 tasks 我需要用两个不同的主机运行这个剧本 主机1和主机2 并且这两个不同的主
  • PDO lastInsertId 不适用于事务?

    我是第一次在 MySQL 中使用 PDO 目前只是在玩它 到目前为止 当我尝试在事务中进行插入时 this gt dbh gt beginTransaction sql query ran this gt dbh gt commit ech
  • jquery滑块背景颜色

    我是网络编程新手 我正在尝试创建包含滑块的网站 我目前正在使用 jquery 来创建滑块 我试图在滑块值小于 5 时将滑块的背景颜色更改为红色 在滑块值大于 5 时将其背景颜色更改为绿色 如何实现此目的 我必须使用 CSS 来完成这个任务吗
  • 将 lib 添加到 Rails 3 中的“config.autoload_paths”不会自动加载我的模块

    我在旁边放置了一个文件名 g rbRails root lib文件夹 文件内容是这样的 module Google end 然后我添加 config autoload paths W config root lib Rails root a
  • 具有形状 (n,) 的 Sympylambdaify 数组

    我目前与 sympy 存在以下 问题 我有一个象征性的表达 比如M matrix pi a sin 1 b 我想要lambdify并传递给数值优化器 问题是优化器需要函数来输入 输出形状的 numpy 数组 n 特别是不 n 1 现在我已经
  • cmake 和使用“make -jN”的并行构建

    我正在尝试为我的源树设置一个基于 CMake 的并行构建 但是当我发出 cmake make j2 I get jobserver unavailable using j1 Add to parent make rule 作为警告 有谁知道
  • printf 如何知道 CString 字符数据的地址?

    考虑这个代码片段 struct My operator const char const return my my CStringA s aha printf s s s my another variadic function to ge