🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2405閲覧

Windowsからmacに変えてコンパイルができなくなった。

ro_rentu

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/12/26 14:03

編集2020/12/26 15:15

Windowsからmacに変えてコンパイルができなくなった。

プログラミング初心者です。初めての質問なので見づらいと思いますがご容赦ください。
「一週間で身につくc言語の基本」というサイトでc言語を独学で勉強していました。
最近M1MacBookが発売されたので買ってみてWindowsと同じ操作ようにgccでコンパイルをしようとした所以下のエラーメッセージが出ました。Windowsではエラーが出ていません。コマンドプロンプトとターミナルでは違いがあるのでしょうか?

発生している問題・エラーメッセージ

prob3-4.c:3:1: warning: return type of 'main' is not 'int' [-Wmain-return-type] void main() ^ prob3-4.c:3:1: note: change return type to 'int' void main() ^‾‾‾ int prob3-4.c:6:13: warning: illegal character encoding in string literal [-Winvalid-source-encoding] ...<90><AE><90><94><82>フ値<82><F0><93><FC><97>ヘ〓<B5><82>ト〓<AD><82><BE><82><B3><82><A2>... ^‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ prob3-4.c:9:19: warning: illegal character encoding in string literal [-Winvalid-source-encoding] printf("10<88>ネ〓<BA><82><A9>90<88>ネ〓<E3><82>ナ〓<B7>¥n") ^‾‾‾ ‾‾‾‾‾‾‾‾‾‾‾‾ ‾‾‾‾ ‾‾‾‾‾‾‾‾ ‾‾‾‾ prob3-4.c:9:39: error: expected ';' after expression printf("10<88>ネ〓<BA><82><A9>90<88>ネ〓<E3><82>ナ〓<B7>¥n") ^ ; 3 warnings and 1 error generated.

該当のソースコード

C

ソースコード

#include <stdio.h> void main() { int a; printf("整数の値を入力してください:"); scanf("%d",&a); if(a <= 10 || 90 <= a){ printf("10以下か90以上です\n"); } }

試したこと

調べてみたもののあまりに初歩的なことなのか載っていませんでした。

補足情報(FW/ツールのバージョンなど)

エディタはvscodeです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/12/26 14:25

ワーニング(警告)とエラーの区別をつけましょう。Windows でエラーは本当に出ませんでしたか? printfにセミコロンがありません。これはエラーになると思います。
ro_rentu

2020/12/26 14:33

回答ありがとうございます。 修正したところこのようになりました。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー prob3-4.c:3:1: warning: return type of 'main' is not 'int' [-Wmain-return-type] void main() ^ prob3-4.c:3:1: note: change return type to 'int' void main() ^~~~ int 1 warning generated.
guest

回答2

0

「一週間で」なんていうキャッチーな言葉で語っているあたり、まぁいろいろ思っちゃいますけどね。

Windowsと同じ操作ようにgccでコンパイルをしようとした

まずこの時点で誤りがあったということはしっかり認識してください。責めるわけじゃなくて、人間ってそういうものだ、「ちゃんとやった」つもりなんてそんなものだという場面にこれからも何度も何度も出会うはずだからです。;が抜けていればどんなCコンパイラでもエラーになりますから、Windowsで試したものと違っていた、ということです。

ところで、本当にgccですか? -Wmain-return-typeというメッセージ、なんだかclangを使っているような気がするのですが。gccだとそこは-Wmainになるような。まぁ、そこらへん私も詳しいわけじゃないので...

とにかく。コンパイラにはいろいろなオプションがあります。使用する文字コードであったり、ある文法事項の軽度な違反、あるいは違反とは言えない微妙な事柄について、警告を出す出さない、場合によってはエラーとしてコンパイルを通さない、などについて様々な選択出来るようになっています。双方gccだったとしてもその設定がWindowsの環境とMacの環境で異なっていたのでしょう。

clangであればコンパイル時に-Wno-main-return-type とすればvoid mainに対する警告を抑止することはできるでしょう(gccでも-Wno-mainでいけるとは思います)。でも、その他の警告の基準が同じかどうかは知りません。

もう一つ言うと、Cのmain関数のシグニチャ(戻り値の型、関数名、引数リストのセット)は

  1. int main(void)
  2. int main(int, char*[])
  3. 上記と同等のもの(typedefによる型宣言で型が異なるもの)
  4. 処理系(コンパイラ)が許すもの

となっています。4が強力すぎてなんとも言えないのですが、別の環境/コンパイラに持っていった時には1,2のケースはほぼ通るけれど、そこから逸脱したvoid main(void)やint main()、void main()は通る保証はされないということでもあります(C++では引数のカッコの中に何も書かれていないのはvoidと等価ですが、Cでは()と(void)は意味が違います)。

サイト製作者の間違いということでしょうか?

特定の環境であれば「間違い」ではないですけれど。サイトの作者はそうでないということを知らないのではないかと思います。
少なくとも、他人にC言語を教えようというのならそのくらいのことは知っていて、標準的なint main(void)で記述するべきだと思います。敢えてvoid main()とする理由はなにも無いでしょう

それと、「コマンドプロンプト」とか「ターミナル」というのはコンピュータを操作するための操作手段を提供するものに過ぎません。それらを通してgccなりclangなりの「コンパイラ」を呼び出しているということをしっかりと認識してください。自分が何をしているのか、問題が起こったときに調べる対象はなにか、というのがわからなくなってしまいますから。

投稿2020/12/27 13:23

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Widowsのコマンドプロンプトでは、標準の文字コードがShiftJISになってます。
ということで、VSCodeの文字コードをUTF8に変更して保存したあとコンパイルをやり直してみてください

投稿2020/12/26 14:06

編集2020/12/26 14:07
y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ro_rentu

2020/12/26 14:17

回答ありがとうございます。 VSCodeの文字コードをUTF8に変更して保存したあとコンパイルをやり直してみましたが以下のエラーメッセージが表示されました。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー prob3-4.c:3:1: warning: return type of 'main' is not 'int' [-Wmain-return-type] void main() ^ prob3-4.c:3:1: note: change return type to 'int' void main() ^‾‾‾ int prob3-4.c:9:46: error: expected ';' after expression printf("10莉・荳九°90莉・荳翫〒縺兔n") ^ ; 1 warning and 1 error generated. ------------------------------------------------------- コマンドプロンプトの時はint書かなくても大丈夫だったのですが、ターミナルだとエラーの原因になるんですかね。
y_waiwai

2020/12/26 14:20

それはエラーでなくワーニングです エラーは文字コードの違いが原因なので、UTF8になってるか確認しとこう
y_waiwai

2020/12/26 14:21

も一度開いて、UTF8になってて正常に表示できてるでしょうか
ro_rentu

2020/12/26 14:27

回答ありがとうございます。 vccodeの文字コードとターミナルの環境設定からテキストエンコーディングをUTF8に変更しましたがそれでもワーニング?が出ています。
y_waiwai

2020/12/26 14:30

そのワーニングを読もうよ。 main関数の戻り値はintのはずがvoidになってるけど、ホンマにえーんかいな、とコンパイラさんが言ってます
ro_rentu

2020/12/26 14:43

int main(void)に変更したら解決できました。 コマンドプロンプトだと大丈夫だったのですがターミナルではワーニングが出るんですね。
y_waiwai

2020/12/26 14:46

大丈夫だったんではなく、単にワーニングが出ないような設定になってたんでしょう どんなコンパイラでどういうオプションつけてコンパイルしたのかは知りませんが。
ro_rentu

2020/12/26 14:54

設定の仕方などわからない素人なのでワーニングを消す設定はしてないと思います。一週間で身につくC言語というこちらのサイトでは http://c-lang.sevendays-study.com/day3.html 答え方がワーニングになるようなコードですがこれはサイト製作者の間違いということでしょうか? 今までWindowsではこのコードの書き方でワーニングが出なかったのが不思議です...
y_waiwai

2020/12/26 15:03

誰かが書いてるとおりにやるんじゃなく、あなたがそれがどういうものなのかを確認して動かしましょう。 ワーニングってのは警告で、コンパイルは行われますんで、それが出たから間違いってわけでもありません。 古い/新しい規格のCではそれが許されていた/許されるようになった、とか、コンパイラの違いにより出る警告も変わる、ってこともあります
y_waiwai

2020/12/26 15:08

まあしかし、警告が出るというのは、バグの可能性があるというコンパイラからのメッセージなので、できるだけ出ないような記述を心がけるというのは正しい姿勢だと思います
ro_rentu

2020/12/26 15:13 編集

最後まで親身に回答から学習に対するアドバイスまでしてくださりありがとうございます。 初質問でここまでしっかりと回答が返ってくると思っていなかったのでとても嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問