• 締切済み

ヘッダファイルとソースファイルについて

C++初心者なのですが ヘッダファイルとソースファイルの関係がよく分かりません。 ヘッダファイルとソースファイルはフリーソフトなどで、統合したりする事が出来るのでしょうか? よろしくお願いします!

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

役割は、既にあるように、複数のソースファイル間で共通で使うものをまとめるためのものがヘッダファイルです。 ですが、ヘッダファイル自体は、C/C++のソースコードです。 他のソースコードから #include で読み込まれることを考えて作られている、というだけです。 実際に、 #include "test.cpp" 等とすれば、 ( 一般にはソースファイルと言われる ) test.cpp を「ヘッダファイル」として使うことができます。 「統合」というのが何を指しているのかがわかりませんが。 #include "header.h" とあったら、 header.h のファイルの中身をコピー → #include "header.h" を消して、その場所にペースト と同等です。 特別なソフトは必要ありません。 実際のコンパイル時には「プリプロセッサ」と呼ばれるプログラムが、上記の作業を行い、その処理されたものをC/C++コンパイラがコンパイルします。 プリプロセッサがどんな処理をするかは、コンパイルオプションで確認することができます。 例えば、 GCC なら -E オプションでプリプロセッサによる処理結果が得られます

回答No.3

最近の言語はモジュールのインターフェースをオブジェクトファイルやライブラリや実行ファイルから 直接読み取ることが多いですが、昔流儀のC/C++ ではインターフェース部分をプログラマ自身が 別ファイルに切り出して共用します。これがヘッダファイルです。 ソフトで統合というのは難しいでしょうね。C/C++でのヘッダファイルは実装と1対1ではないし、 案外複雑だからです。

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.2

ヘッダーファイルは (1) 複数のソースプログラムに分割されているような場合に関数のインタフェースの整合性をとる、 (2) 複数のソースプログラムで共通に使用する翻訳時の制御条件を書いておく、 等の目的で使用します。 (1) を更に説明すれば、ソースプログラムがs0.cとs1.cに分かれていて、s0.cの中からs1.cの中に書かれている関数f1を呼び出す場合に、ヘッダーファイルに関数のプロとタイプを書いておいて、そのヘッダーファイルをs0.cとs1.cが共にインクルードすれば、関数のインタフェースの整合性を取ることができます。 (2) を更に説明すれば、例えば「金額」という項目があったとして、最初はそんなに金を使わないと思って、 short kingaku ; というようにプログラム全体で書いたとします。そのうちにshortでは足りないということになってlongにする必要がでてきた場合に、ソースプログラムの該当箇所を全てshortからlongに書き換えなければなりません。書き換え間違いも起きます。でもヘッダーファイルに typedef short KINGAKU ; と書いて、 ソースプログラムのあちこちで KINGAKU kingaku ; と書いておけば、ヘッダーファイルを typedef long KINGAKU ; と書き直すだけで済んだりします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

同種のもの.

関連するQ&A

  • ヘッダファイルとソースファイルについて

    今までは、Webプログラミングを行っていたのですが、 最近になって、C++の仕事を請け負いましたので、 C++を勉強しつつ、プログラムをしていたのですが、 Webプログラムとの違いに悩んでいる部分があります。 それは、ヘッダファイルとソースファイルの関係についてです。 ほかのファイルから、インクルードされたヘッダファイルが、 読み込まれるというのは納得がいくのですが、 そのヘッダファイルに関連付け(?)られたソースファイルも、 一緒に読み込まれるという理由がわかりません。 ヘッダファイルでソースファイルを読んでいるような記述もないような感じなので、とても疑問に思っております。 なぜ、ヘッダファイルをインクルードしただけで、付属のソースファイルも読み込まれるのでしょうか?

  • ソースとヘッダの境界とは?

    C/C++のプログラミングにおいて、これだけは絶対にソースファイル(.c,.cpp)書かなくてはならない!というものはあるのでしょうか? 仕事でプログラミングをしている時に、同僚から「その変数の定義はソースファイルに書かないとダメ」と言われました。 「その変数の定義」とは、メモリの物理アドレスへの割り付けを伴うもので、以下のようなものです。 #pragma section=~, IO=~, attr=~, locate=0xFECA0000 __io int piyo; /* 0xFECA0000 */ __io int hoge; /* 0xFECA0004 */ 特殊なコードで分かりにくく、申し訳ないのですが、簡単に言えば、「locate」で指定した物理アドレスから連続で変数を割り当てていくものです。 このコードをなぜヘッダではなく、「絶対に」ソースファイルに書かなくてはならないのかを尋ねましたが、明確な回答は得られませんでした。 私の認識としては、ソースファイルにAという処理を書くことと、Aの処理を書いたヘッダファイルをincludeすることとは、コンパイラにとっては全く同じことだと思ってます。 試しに、以下のソースを書いた「ヘッダ」ファイル”test.h”と「#include "test.h"」とだけ書いたソースファイル”test.c”を作成してビルドしたら、ちゃんと動く実行ファイルができました。 #include <stdio.h> int main(void) { printf( "Hello, World!\n" ); return 0; } 今回ご回答頂きたいのは、上記の物理アドレス割り付けのコードについてではなく、一般的な話として、これは「絶対に」ソースファイルに書かなきゃいけない!それは「絶対に」ヘッダファイルに書かなきゃいけない!とか言うものがあるのかどうか。あるとすれば、具体的にどのようなものなのかと言うことです。 何卒よろしくお願いいたします。

  • ヘッダーとソースについて

    メールの詳細情報としてヘッダーとソースがあるのですがどのように違うのでしょうか?またgooのようなフリーメールからメールを送信した場合自分が契約しているプロバイダー情報(例えばYahooやOCNなどのID)などはヘッダーやソースの中に現れてきますか?個人を特定する、その人だけの表示(例えば指紋のように他の人と絶対一致することのないもの)はヘッダーやソースの中にあるのでしょうか?またあるとすればどの部分になるのでしょうか?宜しくお願いします。

  • ソースとヘッダについて

    VC++2008を使っています。これは他でもいえるのではないかと思いますが、一応プロジェクトの種類はWindowsFormアプリケーションです。 字数削減や書きなおしを楽にするために、ある程度のマクロを織り交ぜたコーディングをしたいのですが ソースに#defineしたものの効果範囲は、#undefの場所まで あるいはそれがなければそのソースの終了地点まで でしょうか? もしそうなら、ソースに書く分なら「別のソースに同じマクロを、全く違う定義をして使っても問題ない」という事でしょうか? ヘッダに書いた場合は、なんか#undef文を下の方に書いてもまるで上に書いたかのように「駄目」という判定になってしまったのですが、かといって#undefを書かないとそのヘッダをインクルードする他のヘッダにも影響を与えてしまうようで… これをどうにかできる方法はありませんか? また、ソースでは #pragma once などをしなくてもいいのですか? (あるいは書いてもソースはオブジェクトファイルに変換され、実質的にはコンパイル後に影響が出るため、プリプロセッサはコンパイル前に完了するので、ソースにこれを書いたところで無意味ということでしょうか?)

  • VC++ ヘッダ・ソースのみで再構築は可能ですか?

    C++で開発されたアプリを再構築する事になりましたが、納品時のヘッダとソースファイルしかありません。プロジェクトファイルやビルド環境のファイルも何もありません。まさしくヘッダとソース(cpp)しかない状況で、開発するために再構築してデバックできる環境を整える事になりました。ちなみに、このアプリはC++言語で、開発ツールはVS6で開発されたそうです。 どのたか、再構築する方法を教えていただけないでしょうか? また、VC2010などの最新のVCで開発したいと思っておりますがそれも可能でしょうか? 過去にC言語で電話システムの開発経験はありますが、Windowsでのアプリ開発の経験はほとんどありません。 以上、よろしくお願いいたします。

  • Tftpd32のソースファイルを開きたい

    フリーソフト(オープンソース)のTftpd32のソースファイルを開きたいのです。 http://tftpd32.jounin.net/tftpd32_download.html 上記URLにて、v3.25のソースファイルをDLし、 Visual C++ 2008 Express Edition にて、ソースは開くのですが、 コンパイルすると、エラーになってしまいます。 tftpd32のソースは、Visual C++ 2008用ではないのでしょうか? どなたか試された方がいらっしゃれば教えてください。

  • 1 つのヘッダファイルに複数のクラスって?

    C++ でコンソールアプリケーションを作っています。 プログラムの規模が大きくなり,クラスの数も増えてきました。 これまでヘッダファイルとクラスを一対一対応させてきました。 クラスの増加に伴い,ヘッダファイルがかなり増えてしまいました。 疑問に思ったのですが 1 つのヘッダファイルに記述するクラスの個数に,決まりはあるのでしょうか? ためしに 1 つのヘッダファイルに 2 つのクラスを書くと,問題なく動作しました。 ちなみに,その 2 つのクラスの関係は,お互いに完全に独立し合っている関係です。 (継承や friend の利用など一切なし,ということです。) 1 つのヘッダファイルに複数のクラスを書くことは OK なのでしょうか? またこうすることで生じる問題があれば,お聞かせいただければ幸いです。 (プログラミング超初心者につきマヌケな質問をしているかもしれません)

  • VC++2005であるヘッダファイルを複数のソースから読み込みたいのですが…

    毎度お世話になっています。 現在VC++2005でUSBカメラ画像の処理プログラムを作成しているのですが、 現在こちらのEWCLIBというライブラリを利用しています。 http://www.geocities.jp/in_subaru/ewclib/ このライブラリを 一つのソースファイルからから呼び出した場合問題無いのですが、 複数のソースファイルから呼び出した場合error LINK2005 既に~で定義されています… といったエラーが出てしまいます。 複数のソースファイルからこのライブラリを利用したい場合どのようにすればいいでしょうか? このライブラリは #define EWC_BRIGHTNESS 0 … int ewc_init=0; … int ewc_ncam; … int EWC_GetImage(int num, void *buffer){ … } と単一のヘッダファイルに変数や関数の定義を行っているのですが、 複数のソースファイルからこのライブラリを利用したい場合、やはりヘッダとソースに分割する必要があるのでしょうか? 参考になるページや解決方法等、お伺いしたいです。

  • bcc32でSJIS以外のヘッダファイルが使えない

    こんにちは。 コマンドプロンプト上で、Borland C++ Compiler 5.5 のbcc32コマンドを使い、エンコーディングがShift_JIS以外、例えばUTF-8のヘッダファイルをインクルードしたソースファイルをコンパイルしようとすると、上手くいきません。 ヘッダファイルがShift_JISなら、それをインクルードしているソースがShift_JISでなくても、コンパイルできました。 bcc32をコンパイルコマンドとして扱う場合は、Shift_JISのヘッダファイルしか使えないのでしょうか? 以上の件について何かご存知の方がいらっしゃれば、是非教えて頂きたいと思います。 では、よろしくお願い致します。

  • Cygwinでの自作ヘッダファイルの使用方法

    Cygwinでソースをコンパイルすると cygdrive/c/DOCUME~1/user/..../cc5uZTak.o:submain.c: undefined reference to 'parameter' と言うエラーが出ます。 ヘッダファイルも宣言しているのですが...コンパイルが通りません ヘッダファイルの位置が行けないのでしょうか?