none
communityにおいて、"型 *変数名[]"の定義がコンパイルエラーになる事について。

    質問

  • 皆様、お世話になります。

    実は、Visual Studio Communityを使用しているのですが、C言語においての基本的なコーディングで行き詰まってしまい、お力をお借りしたいと思っております。

    その内容とは、仮に、

           char *str1[];

    と言うコーディングの部分で、コンパイルエラーが出ます。

    次に、

           char *str2[6] ={ "abc","def","ghi" };

    と、すると、2つめの初期化の"def"の定義において、エラーが出ます。

    しかし、main関数の引数指定のargvにおいては、"char *argv[]"が、通ってしまいます。

    何がおかしいのか、こちらは打つ手なしです。

    includeは、stdio.hのみです。プロジェクトはコンソール用のものです。ファイルの種類は、.cppですが、記述レベルは、.cのものです。

    Versionは、Visual Studio Community 2017 です。

    なにとぞ、お力添えの程を、宜しくお願いいたします。

    2018年11月4日 2:07

すべての返信

  • char *str1[];

    というコードは、配列の要素数が省略されていますが、配列の要素数を省略する場合は必ず、要素数を明確にするため右辺が必要となります。
    参考サイト: https://builder.japan.zdnet.com/script/sp_c-programming-language/20370163/

    次に、

    char *str2[6] ={ "abc","def","ghi" };

    というコードですが、

    最近の Visual Studio の C++ コンパイラは、「文字列リテラルを使用して初期化されたポインターに対して const 修飾による標準への厳密な準拠を要求します。」とのことらしいです。(Visual C++ 2010 で試したところ上記のコードはエラーとはなりませんでした。)

    上記のコードでは、右辺が const の文字列リテラルに対して、左辺は const ではないため、コンパイルエラーとなります。下記のコードように左辺の先頭に const を追加するか、コンパイルオプションに「/Zc:strictStrings-」 をつけることでエラーはなくなると思います。

    const char *str2[6] ={ "abc","def","ghi" };

    参考サイト: https://msdn.microsoft.com/ja-jp/library/dn449508(v=vs.140).aspx

    *質問は 1 つの投稿で 1 つに絞った方が閲覧者が見やすいかもしれません。
    2018年11月4日 2:47
  • 最近の Visual Studio の C++ コンパイラは、「文字列リテラルを使用して初期化されたポインターに対して const 修飾による標準への厳密な準拠を要求します。」とのことらしいです。(Visual C++ 2010 で試したところ上記のコードはエラーとはなりませんでした。)
    コンパイラ(cl.exe)の挙動としては変更ありません。ただし、Visual Studio 2017 15.5以降の環境で新規プロジェクトを作成した際のプロジェクトのデフォルト値として/permissive-が設定されるように変更されています。/permissive-が設定されると連動して/Zc:strictStringsが設定され、kenjinoteさんの説明されたような動作となります。
    2018年11月4日 5:58
  • 皆様、ありがとうございます。

    お答えを基本にして、もう少し自分で調べてみようと思います。

    非常に参考になりました。

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

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

    フォーラム オペレーターから 1 点お願いをさせてください。

    参考となる返信 (情報) をいただいたら、その投稿に対して
    [回答としてマーク] をご設定ください。

    同じ問題で後から参照した方が、情報を見つけやすくなりますので、
    ご協力くださいますようお願いいたします。


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

    2018年11月14日 4:05
    モデレータ
  • このフォーラムの質問に対するある程度の答えが見つかりました。

    まず、1つめの char *str1[];

    と言うのは、現実的に char **str1;

    で代用できることが解りました。

    この答えは、元のアドレスからの代入において、配列変数では不具合が生じるようです。

    そのため、初期変数の定義においては、ポインタ配列で初期変数を定義せねばならなかったようです。

    次に、 char *str2[6] = {...};

    においては、ご指摘通りにconstを付ける事で改善しました。

    C++においての基本的な構文の所で助けを求めました事を深く反省いたします。

    また、それでも、丁寧な回答をお答え下さった皆様には深く感謝いたします。

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

    2018年11月27日 1:48
  • 立花様。

    ご意見、誠にありがとうございます。

    実は、そのご指摘の手段を理解出来ずに困っております。

    [解答としてマーク]

    とは、何ものなのでしょうか?

    画面を見てもその様な項目は見受けられません。

    解らない事だらけに誠に申し訳ありません。

    もし、よろしければ、その意図と方法をお教えいただければ幸いです。

    失礼いたします。

    2018年11月27日 1:52
  • ぷにすけ2 さん、こんにちは。フォーラム オペレーターの立花です。
    ご返信くださいましてありがとうございます。

    [回答としてマーク] は、例としてお伝えしますと、この投稿の下に、
    [返信] などのリンクが表示されています。
    その中、左から 3 つめあたりに表示されておりませんでしょうか。

    ※現在のアカウントは投稿した時のアカウントとは異なるようですので、
      投稿時のアカウントでサインインしなおす必要があります。

    スレッドでのやり取りが長くなると、後から閲覧した方が、
    どの情報が有用だったのか探すのが大変になってきます。
    そのため、参考となった返信に [回答としてマーク] を設定いただき、
    情報が見つけやすくなるようにご協力をお願いいたしています。


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

    2018年11月27日 2:11
    モデレータ