none
ビルドエラーの対応方法を教えてください。

    質問

  • 現在VS2012(C++)で作ったプログラムをVS2017でビルドし直していますが、

    以下のコード(サンプル)の①でエラーが起きます。

    --------------------------------------------------------

    FILE* fp = fopen("C:/temp/aaa.txt","w");

    if(fp)

    {

        char aaa[48];

        fp->_base = aaa;    //①

        fclose(fp);

    }

    -----------------------------------------------------

    エラー内容は
    エラー C2039 '_base': '_iobuf' のメンバーではありません。 

    です。

    VS2017のFILE(_iobuf)の定義個所を見たところVS2012のころとメンバ変数が変わっていたのでエラーになっているということはわかりましたが、これの直し方がわかりません。

    ----VS2012----

    struct _iobuf {
            char *_ptr;
            int   _cnt;
            char *_base;
            int   _flag;
            int   _file;
            int   _charbuf;
            int   _bufsiz;
            char *_tmpfname;
            };
    typedef struct _iobuf FILE;

    ----VS2017----

        typedef struct _iobuf
        {
            void* _Placeholder;
        } FILE;

    ----------------

    なるべく元のコードを残しつつ動作も同じにしたいのですが、

    _Placeholderを使って簡単にエラーを無くすことはできないでしょうか?

    よろしくお願いいたします。

    2018年5月14日 5:07

回答

  • 非公開メンバーへのアクセスは何ら保証されていません。公開メンバーを使用すべきです。_baseであればsetvbufという正規の手順が用意されています。

    なお、Visual C++ 2015にてCランタイムライブラリがC++言語を使って全面的に書き直されました。

    2018年5月14日 5:46
  • サンプルコードの「まま」を素直に解釈すると、
    ①の部分に効果はないと考えられるので削除してしまっても良いのではないでしょうか。
    他に効果のあるコードがある場合はこの限りではありません。

    >_Placeholderを使って簡単にエラーを無くすことはできないでしょうか?

    やってはいけないと思います。他の手段をとるべきだと考えます。
    仮に、_Placeholderが何者であるかの詳細がわかっている場合でも、
    それが「非公開メンバ」である場合は、参照するべきではありません。
    「非公開メンバ」が非公開であるのは今回の様に「任意の時に説明なく変更する可能性がある」
    のが、理由の一つになります。
    2018年5月14日 10:38

すべての返信

  • 非公開メンバーへのアクセスは何ら保証されていません。公開メンバーを使用すべきです。_baseであればsetvbufという正規の手順が用意されています。

    なお、Visual C++ 2015にてCランタイムライブラリがC++言語を使って全面的に書き直されました。

    2018年5月14日 5:46
  • サンプルコードの「まま」を素直に解釈すると、
    ①の部分に効果はないと考えられるので削除してしまっても良いのではないでしょうか。
    他に効果のあるコードがある場合はこの限りではありません。

    >_Placeholderを使って簡単にエラーを無くすことはできないでしょうか?

    やってはいけないと思います。他の手段をとるべきだと考えます。
    仮に、_Placeholderが何者であるかの詳細がわかっている場合でも、
    それが「非公開メンバ」である場合は、参照するべきではありません。
    「非公開メンバ」が非公開であるのは今回の様に「任意の時に説明なく変更する可能性がある」
    のが、理由の一つになります。
    2018年5月14日 10:38
  • 回答ありがとうございます。

    そうですよね。非公開メンバへのアクセスはやめた方が良いですよね。

    全面的に修正する形で考えます。

    setvbufという手段参考にしてみます。

    ありがとうございました。

    2018年5月16日 2:47
  • 回答ありがとうございます。

    やはりやってはいけないことなんですね。他の手段をとるようにしてみたいと思います。

    ※確かに今回のように変更されて困るのはもう避けたいので、違うやり方で考えます。

    ありがとうございました。

    2018年5月16日 2:49
  • ma_da さん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    オペレーターから 1 点お願いをさせてください。
    参加者の方からお寄せいただいた情報で参考になった投稿には、
    その投稿に [回答としてマーク] をご設定ください。

    同じ問題であとから参照した方が情報を素早く情報を見つけられるよう、
    ご協力の程どうぞよろしくお願いいたします。

    フォーラム利用時の注意点のお知らせです。
    ※初めてご投稿された方を対象にお知らせしています。

    ご利用の際は、下記内容をお守りいただきますと
    情報が寄せられやすくなりますので、ぜひご一読ください。
    フォーラムでご質問頂くにあたっての注意点
    フォーラムのご利用方法(質問の投稿)について
    フォーラムへの回答に関するガイドラインおよびフォーラム運営について(再掲)
    ご意見、ご要望はこちらのフォーラムまで。
    各種設定方法はフォーラム内を [かんたん フォーラム ガイド] で検索してみてください。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年5月16日 6:06
    モデレータ