2
#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で機能するのですか?

4

2 に答える 2

9

その理由は、Visual Studio の の実装でstd::stringは、最初のメンバーがchar*. by 値を渡すと、stringこのポインター (および他のデータ メンバー) がスタックにコピーされ、それ%sprintf()読み取られchar*て正しく解釈されます。これは、stringnull で終了する必要があるためです。

もちろん、これは未定義の動作に依存しているため、行うべきではありません。

于 2012-05-18T16:36:47.257 に答える
7

未定義の動作の結果として考えられるのは、プログラムが意図したとおりに動作するためです。これ以上見る必要はありません。未定義の動作は、ある特定のコンパイラでの動作を理解しようとするのではなく、単純に回避するものです。

于 2012-05-18T16:34:12.177 に答える