2
#include <string>
#include <cstdio>
int main() {
  std::string s = "12345678";
  std::printf("[%s]\n", s);
}

这是缺少“.c_str()”的明显错字。但是即使使用 /Wall VS2011 也不会发出任何警告,并且程序可以正常工作。如果要在 gcc 中编译此代码,它会显示“警告:不能通过 '...' 传递非 POD 类型的对象 'struct std::string';调用将在运行时中止”并且程序因“非法指令”而崩溃.

他们是否真的在 VS STL 中实现了一个技巧来使具有这种错字的程序工作,只是因为这种错字很常见?

更新:问题是为什么它在 VS 中有效?

4

2 回答 2

9

原因似乎是在 Visual Studio 的实现中std::string,第一个成员是char*. 传递string值将这个指针(以及其他数据成员)复制到堆栈上,以及读取它的%s原因- 并正确解释它,因为需要以空值结尾。printf()char*string

当然,这依赖于未定义的行为,您不应该这样做。

于 2012-05-18T16:36:47.257 回答
7

它之所以有效,是因为未定义行为的一种可能结果是程序按照您的意愿行事。你不需要再看这个了。未定义的行为是您简单地避免而不是试图理解它在特定编译器中的表现形式。

于 2012-05-18T16:34:12.177 回答