Ale*_*der 2 c++ std visual-c++ visual-studio-2012
#include <string>
#include <cstdio>
int main() {
std::string s = "12345678";
std::printf("[%s]\n", s);
}
Run Code Online (Sandbox Code Playgroud)
这是一个缺少".c_str()"的明显错字.但VS2011即使使用/ Wall也不会发出任何警告,并且程序正常运行.如果要在gcc中编译此代码,它会显示"警告:无法传递非POD类型的对象'struct std :: string'到'...';调用将在运行时中止"并且程序崩溃时出现"非法指令" .
他们真的在VS STL中实现了一个技巧,让程序有这样的拼写错误只是因为这个拼写错误很常见吗?
更新:问题是为什么它在VS中有效?
原因似乎是在Visual Studio的实现中std::string,第一个成员是char*.传递stringby值会将此指针(以及其他数据成员)复制到堆栈上,以及读取它的%s原因- 并正确解释它,因为需要以null结尾.printf()char*string
当然,这是依赖于未定义的行为,您不应该这样做.
| 归档时间: |
|
| 查看次数: |
2514 次 |
| 最近记录: |