質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

4回答

4565閲覧

ヘッダーファイル内での変数の宣言について

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2019/05/14 08:24

前提・実現したいこと

C言語を勉強しているのですが、勉強をするにあたって苦しんで覚えるC言語というサイトを参考にしています。今はヘッダーファイルを扱う章を進めていて、そこで、サイトには動かないと書いてあったコードが動いてしまい不思議に思い質問しました。

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

こちらには

例えば、次のようにヘッダーファイル内で変数を宣言すると、

宣言が重複している、という意味のエラーが表示され、コンパイル出来ません。

C

1/* sum.h */ 2int sum(int min,int max); 3int Public;

と書いてあるのですが、自分の環境ではsum.hにこのまま書いても動いてしまいました。

該当のソースコード

/* main.c */ #include <stdio.h> #include "sum.h" int main(void) { int value = 0; value = sum(1, 2); printf("%d\n", value); return 0; }
/* sum.c */ int sum(int min, int max) { int num; num = (min + max) * (max - min + 1) / 2; return num; }
/* sum.h */ int sum(int min, int max); int public;

補足情報

gccコンパイラを使用
% gcc main.c sum.c でコンパイルしましたが、苦しんで覚えるC言語のサイトにgcc用のコマンドが載っていなかったので間違っていたら教えていただけると幸いです。

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

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

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

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

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

guest

回答4

0

a.c, b.c というファイルのどちらもがsum.hをインクルードしている場合、リンクエラーがでます

ですから、sum.hを読み込むcファイルが1つしかない場合はエラーが出ません

投稿2019/05/14 08:28

izmktr

総合スコア2856

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

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

0

すでに他の回答がありますように、sum.csum.hをインクルードしてないからですが、C言語では

int public; ```が複数のソースに書かれていても、処理系(コンパイラー)によってはエラーにならないものもあります。例えば、`gcc`や`VC++`はエラーにならないはずです。 `C言語`では

int public;
```は“仮の”定義です。複数の仮の定義があった場合、処理系によってはエラーになりますが、gccVC++のように一つのインスタンスにまとめるものもあります。

とはいえ複数の定義があると混乱のものなので、定義は一カ所にして、他はexternを付けて宣言にした方がいいですね。

投稿2019/05/14 10:19

Bull

総合スコア986

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

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

0

インクルードガードの問題かね...
もしくはこちらに書かれている事があてになると思います。

普通は両方行うので、片方ずつデバックを行うのがいいと思います。

投稿2019/05/14 09:14

stdio

総合スコア3307

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

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

0

ベストアンサー

sum.c のほうでもそのヘッダファイルをインクルードしましょう
そうすればエラーになります


なぜエラーになるのかを考えてみましょう
まあ、そもそもヘッダファイルで変数の定義は行っても、変数宣言は行うべきではありませんね

投稿2019/05/14 08:27

編集2019/05/14 08:34
y_waiwai

総合スコア87747

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

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

退会済みユーザー

退会済みユーザー

2019/05/14 08:52

回答ありがとうございます。 定義が2回行われるからでしょうか?
y_waiwai

2019/05/14 08:58

複数の場所で同じ名前の変数が作成されるため、リンク時にエラーになります まあ、これがグローバル変数(外部にも公開される変数)なのでこういうエラーが出るってことですね。 #staticを付けた変数宣言だと、どういうことが起こるのか考えてみたらいいかもしれません
退会済みユーザー

退会済みユーザー

2019/05/14 09:56

なるほど、参考になります。 他の.cファイルで値を変更すれば中身も変わるのではないかと思いました。
y_waiwai

2019/05/14 10:22

staticをつけた変数宣言では、その変数名は宣言されたファイルの中だけ有効となります ということは、ヘッダファイルにstatic付きで変数宣言を行うと、そのヘッダをインクルードしたソース・ファイルの数だけその変数が生成されるってことが起こります まあ、エラーも出ず、異常な動作もしない代わりに、ソース・ファイルの数だけ、無駄な変数領域が消費されるということになります とあるソース・ファイルが数十あるプロジェクトで、やけにメモリ消費が多いな、と思ってたら、とあるヘッダファイルにstatic変数が大量に宣言されてたってことがありましたね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問