質問者
Microsoft Visual Studio 2015で削除された関数について

質問
-
Microsoft Visual Studio 2015で削除された関数を教えてください。
gets、_getws
cgets、_cgetws
_outp、_outpw、_outpd
_inp、_inpw、_inpd
_heapadd、_heapset、_heapused上記は削除した旨公開されていますが、
__flsbufの削除については明記されていません。
__flsbuf以外にも削除された関数は有る模様ですが、
削除された関数の全貌が知りたいです。
古いライブラリをVC2015でリンクした際に
未解決が出ており、対応に追われています。
VC2015で削除された関数がわかれば、
呼出し元を特定し、そもそものプログラム構造からの見直しが必要か
別の関数に置き換えられないかなど、
どう対処するかを検討したいです。
すべての返信
-
__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/2b372e482def5cfc96e4747b4e2c8aa4libcmt.lib からなくなっているシンボルの一部は、Visual Studio 2015 の legacy_stdio_definitions.lib など他の lib に移動されたものもあるようですので、個別に調べていく必要があるのかなと思います。
参考サイト: https://msdn.microsoft.com/ja-jp/library/bb531344.aspx?f=255&MSPPError=-2147217396- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年1月31日 0:27
-
MS-DOS時代から脈々と引き継がれてきていたC Runtime LibraryがVisual Studio 2015にて全面的に書き直されました。その際、記述言語もC言語からC++言語に変更されているため、マクロでなくテンプレートクラス・関数やインライン関数などが使われるため、基本的に非公開APIは維持されていないと考えるべきです。
libcmt.lib からなくなっているシンボルの一部は、Visual Studio 2015 の legacy_stdio_definitions.lib など他の lib に移動されたものもあるようです
移動されたわけではありません。マクロなどでインライン展開されてしまうためにシンボルそのものが存在しなくなっています。そのため古い.objファイルと静的リンクするために互換シンボルが提供されているに過ぎません。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年1月31日 0:27