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

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

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

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

Q&A

解決済

3回答

11204閲覧

ヘッダファイル、ソースファイルに分割した場合のコンパイル方法について

keikeikei

総合スコア17

C

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

0グッド

0クリップ

投稿2019/01/24 13:57

前提・実現したいこと

gccを使った複数ファイルでのC言語のコンパイル

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

独学でC言語を学んでいる初心者です。
知っていて当然な質問でしたらすみませんが、自力で解決できないため質問させてください。

『苦しんで覚えるC言語』を勉強していてファイル分割の解説まできました。
ヘッダファイル、ソースファイル、インクルード元のmain関数があるファイル
の3つに分割されたファイルがあり、コンパイルしたのですがインクルードがうまく行っていないようです。

合計値を計算して出力するプログラムなのですが、合計値が0で出力されてしまいます。

何らかのやり方でヘッダファイルを紐付ける必要があると思われるのですが(リンク??)、調べても分かりませんでした。

該当のソースコード

/* main.c */
include <stdio.h>
include "sum.h"

int main(void) {
int value;
value = sum(50, 100);
printf("%d\n", value);
return 0;
}

/* sum.c */
int sum(int min, int max) {
int num;
num = (min + max) * (max - min + 1) / 2;
return 0;
}

/* sum.h */
int sum(int min, int max);

試したこと

$ gcc -o main main.c sum.c
→実行ファイルmainが作成され、実行すると0と表示される。

$ gcc -o main main.c sum.c sum.h
→clang: error: cannot specify -o when generating multiple output files

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

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

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

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

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

guest

回答3

0

使用しているgccのバージョンによって異なりますが、gccにヘッダファイルを指定するとプリコンパイル済みのヘッダファイルを生成するようになっています。試しにgcc sum.hで実行した場合に、sum.h.gchが生成されるようならば、これに該当します。

この場合、gcc -o main.c sum.c sum.hとすると出力されるファイルが2つ(実行ファイルとプリコンパイル済みヘッダ)になるので、出力先ファイル名を指定すると今回のエラー「生成されるファイルが複数ある時は-oを指定出来ません」となります。

プログラムの実行結果については、他の方の回答の通りです。

投稿2019/01/24 17:50

StupidDog

総合スコア263

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

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

keikeikei

2019/01/25 00:27

StupidDogさん 回答ありがとうございます!
guest

0

ベストアンサー

C

int sum(int min, int max) {
int num;
num = (min + max) * (max - min + 1) / 2;
return 0;
}

return 0 すれば、当然0が返ります。本当に返したい値はnumではないのですか?

何らかのやり方でヘッダファイルを紐付ける必要があると思われるのですが(リンク??)、調べても分かりませんでした。

分割コンパイルは今回のバグには無関係です。
試しに一つのファイルに全てまとめてコンパイルしても、全く同じ挙動になるでしょう。

C

1#include <stdio.h> 2 3 4int sum(int, int); 5 6int main(void) { 7 int value; 8 value = sum(50, 100); 9 printf("%d\n", value); 10 11 return 0; 12} 13 14int sum(int min, int max) { 15 int num; 16 num = (min + max) * (max - min + 1) / 2; 17 return 0; 18}

標準エラー出力及び標準出力 Wandbox

prog.c: In function 'sum': prog.c:15:9: warning: variable 'num' set but not used [-Wunused-but-set-variable] int num; ^~~ 0

また、ヘッダファイルにはインクルードガードを付けるようにした方が良いでしょう。
マクロを定義すれば良いですし、環境依存しても良いのなら #pragma once も有用です。

コードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
C

投稿2019/01/24 14:01

編集2019/01/24 14:11
LouiS0616

総合スコア35660

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

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

keikeikei

2019/01/25 00:31

LouiS0616さん 回答ありがとうございます! こんな初歩的なミスに気づかなかったなんて…。 しかもteratailの使い方まで教えていただき助かります! ベストアンサーにさせていただきました。
guest

0

既に回答はついていますが、

何らかのやり方でヘッダファイルを紐付ける必要があると思われるのですが

これは、main.c 内で、#include "sum.h" (# 落ちてますね)で解決されています。 #inclde は、指定したファイルをこの場所に 読み込む指示です。

従って、

$ gcc -o main main.c sum.c sum.h

の最後の sum.hは余分です。 (そのためのエラーではないかと)

sum.h での int sum(int min, int max); は、sum関数がどんな引数をとって、戻り値(の型)が何であるかを宣言しています。 C言語の場合、関数を呼び出す前に関数の形式を宣言する必要があります。

投稿2019/01/24 14:23

pepperleaf

総合スコア6383

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

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

keikeikei

2019/01/25 00:28

pepperleafさん 回答ありがとうございます! ヘッダファイルの紐付けはincludeすれば十分なんですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問