none
Microsoft Visual Studio 2015で削除された関数について RRS feed

  • 質問

  • Microsoft Visual Studio 2015で削除された関数を教えてください。

    gets、_getws
    cgets、_cgetws
    _outp、_outpw、_outpd
    _inp、_inpw、_inpd
    _heapadd、_heapset、_heapused

    上記は削除した旨公開されていますが、

    __flsbufの削除については明記されていません。

    __flsbuf以外にも削除された関数は有る模様ですが、

    削除された関数の全貌が知りたいです。

    古いライブラリをVC2015でリンクした際に

    未解決が出ており、対応に追われています。

    VC2015で削除された関数がわかれば、

    呼出し元を特定し、そもそものプログラム構造からの見直しが必要か

    別の関数に置き換えられないかなど、

    どう対処するかを検討したいです。

    2017年1月27日 10:53

すべての返信

  • そもそも__flsbufは非公開APIのようです。使用は推奨されておらず自己責任となります。ですので、全貌を調べるのも自己責任で頑張るべきです。
    • 回答の候補に設定 佐祐理 2017年2月6日 21:14
    2017年1月27日 13:00
  • __flsbuf は libcmt.lib に定義があったようですので、Visual Studio 2013 と Visual Studio 2015 で libcmt.lib の変更点を調べるために、下記のコマンドを使ってlib内のpublic symbolsを取得してみました。

    dumpbin /LINKERMEMBER libcmt.lib

    出力結果として、VS2013では「7913 public symbols」となっていたところが、VS2015では「693 public symbols」となっており、シンボル自体(非公開関数を含む)がかなり削られているようでした。
    シンボルに?,@,$の文字を含まないものに限定して差分をとってもここに記述できないほど多く(2000より多く)のシンボルがなくなっているようです。(何か間違ってるのかな?)
    https://gist.github.com/kenjinote/2b372e482def5cfc96e4747b4e2c8aa4

    libcmt.lib からなくなっているシンボルの一部は、Visual Studio 2015 の legacy_stdio_definitions.lib など他の lib に移動されたものもあるようですので、個別に調べていく必要があるのかなと思います。

    参考サイト: https://msdn.microsoft.com/ja-jp/library/bb531344.aspx?f=255&MSPPError=-2147217396

    2017年1月29日 13:31
  • MS-DOS時代から脈々と引き継がれてきていたC Runtime LibraryがVisual Studio 2015にて全面的に書き直されました。その際、記述言語もC言語からC++言語に変更されているため、マクロでなくテンプレートクラス・関数やインライン関数などが使われるため、基本的に非公開APIは維持されていないと考えるべきです。

    libcmt.lib からなくなっているシンボルの一部は、Visual Studio 2015 の legacy_stdio_definitions.lib など他の lib に移動されたものもあるようです

    移動されたわけではありません。マクロなどでインライン展開されてしまうためにシンボルそのものが存在しなくなっています。そのため古い.objファイルと静的リンクするために互換シンボルが提供されているに過ぎません。

    2017年1月29日 14:01