在Visual Studio中通过printf()打印std :: string

时间:2012-05-18 16:27:13

标签: c++ visual-c++ visual-studio-2012 std

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

这是一个明显错误的“.c_str()”。但VS2011即使使用/ Wall也不会发出任何警告,并且该程序可以运行。如果要在gcc中编译此代码,它会显示“警告:无法传递非POD类型的对象'struct std :: string'到'...';调用将在运行时中止”并且程序崩溃时出现“非法指令”

他们是否真的在VS STL中实现了一个技巧,让这个打字错误的程序只是因为这个错字很常见?

更新:问题是它在VS中的作用?

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:7)

这是有效的,因为未定义行为的一个可能结果是程序执行您想要的操作。你不需要再看这个了。未定义的行为是您可以避免的,而不是试图在一个特定的编译器中理解它的表现形式。