• 締切済み

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

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; } 今回ご回答頂きたいのは、上記の物理アドレス割り付けのコードについてではなく、一般的な話として、これは「絶対に」ソースファイルに書かなきゃいけない!それは「絶対に」ヘッダファイルに書かなきゃいけない!とか言うものがあるのかどうか。あるとすれば、具体的にどのようなものなのかと言うことです。 何卒よろしくお願いいたします。

みんなの回答

  • walktkd
  • ベストアンサー率22% (103/461)
回答No.1

Cは使ってますがC++は全然分かりません。その前提で。 質問者さんの考えているとおり、これは必ずソースに、これは必ずヘッダに、というのは思い当たりません。 コンパイル時は実コンパイル前にプレコンパイルが行われて、ヘッダの中身がプレコンパイル時にインクルードしてる行にまるまるコピペされたものが実コンパイルされるイメージです。 この仕組みからもないと思います。 ただし、仕事で納品するプログラムは動けばいいという訳ではなく、読みやすさ、後々のメンテナンスのしやすさ等も品質として評価されます。(特別技術の高い人がCodingして、平均的能力の担当者に代わったら、仕様変更時に触れなくなってしまったとかも避けなければいけません。同じような10本のプログラムのうち1本だけ作りが違うとかも良くありません。) 通常、複数で開発する場合、Coding規約というものがありますがそれに違反してませんか? もし、違反してればCのルール上問題なしでも同僚のいう「絶対ダメ!」が正解です。 (試しにやった中身全てをヘッダに入れるとかあまりに非常識な場合も仕事の上では「絶対ダメ!」になると思います。)

関連するQ&A

  • C++のヘッダーについて

    C++のプログラミングをしています そこで出てきた問題なのですが・・・ class Aのヘッダファイルa.hをほかのcppファイルにインクルードすると、 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2146: 構文エラー : ';' が、識別子 'test' の前に必要です。 とほかのヘッダファイルでコンパイルエラーがでます ヘッダファイルをインクルードしたときのみこのエラーがでて困っています。 解決法や、ヒントになりそうな事例を知りませんでしょうか?

  • C言語のヘッダファイルの使い方

    ヘッダファイルの使い方について質問です。 ソースファイルA、ソースファイルBで共有して使用したい変数がある場合、 Aでは「int a」と宣言し、Bでは「extern int a」と宣言すれば 同じ変数を共有出来ると認識しています。 それをヘッダファイルへ記述しておきたい場合にはどのように 宣言しておけば良いのでしょうか? ヘッダファイルに「int a」と宣言した場合は両方のソースファイルで includeした時に多重定義でエラーとなります。 では「extern int a」と宣言しておいて、両方のソースファイルで includeするのが正しいのでしょうか? 初歩的な質問で申し訳ないですが、有識者の方、教えてください。

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

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

  • C言語でヘッダファイルにグローバル変数を宣言する

    main.hに static int a; と記述し、main.cで #include "main.h" [省略] a=10; のように使用して、-Wallをつけてコンパイルすると、main.cで使用しているにも関わらず、 'a' defined but not used という警告が表示されます。 同様に、関数においても、ヘッダファイルでstaticをつけると ‘~’ declared ‘static’ but never defined と警告されます。 静的グローバル変数などは、ソースファイル内で宣言しなければいけないのでしょうか?ヘッダファイル内で宣言しても警告が出ないような方法はありますか?

  • ヘッダファイルの2重のインクルードについて

    ある書物に「ヘッダファイルを複数回インクルードすると、それを”再定義”することによるエラーになる」と書いてありますたが、以下のようなヘッダファイルを作りそれを数回インクルードしても何ら異状が無くコンパイルできました。 math.h→ヘッダファイル名 #define max(a,b)  ((a)>(b)?(a):(b))→ヘッダファイルの内容 c ファイル #include<stdio.h> #include"math.h"←複数回インクルード #include"math.h"←複数回インクルード int main(void){ int x=1,y=2; printf("max(x,y)=%d\n",max(x,y)); return 0; } 環境としては、RedHat Linuxでviです。 何ゆえ、エラーにならないのか良く解りません。 宜しくお願いします。

  • Cソースにホスト変数を宣言したヘッダをインクルード方法

    C言語ソースにホスト変数を宣言したヘッダをインクルードする記述を教えてください。下記の記述をしたのですが、エラーになります。 EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; #include "../host_header.h" EXEC SQL END DECLARE SECTION;

  • linuxにおけるCの自作ヘッダファイル

    現在C言語のしっかりと学ばなかった部分を学習したいと思い、自作ヘッダファイルの作成を勉強しています。 そこで、書籍のその章を一通り読んだあと、自分で簡単なものを作成してみましたが、エラーが出てうまくいきません。 どうしてかわかる方いたら教えてください。 コード *****main.c***** #include "print.h" int main(void) { print(); return 0; } *****print.c***** #include <stdio.h> void print(void) { printf("test\n"); } *****print.h***** extern void print(void); エラー /tmp/ccH551c1.o: In function `main': /home/ユーザ名/Documents/StudyC/main.c:5: undefined reference to `print' collect2: ld returned 1 exit status CentOS6.6にて端末上での実行です。 自分の解釈では、""でincludeすることでカレントディレクトリから目的のヘッダファイルを見つけ出してインクルードする、また、ヘッダファイル内でexternすることによってprint.cから目的の関数を定義しているので、main.cでは問題なく使えると思っています。 しかし、エラーではprint()が定義されていないと出るのでまったくわかりません・・・。

  • JSPでCのようにヘッダーファイルをインクルード

    JSPでCのようにヘッダーファイルをインクルード お世話になります。 JSPでウェブページを作成しています。 ページ読み込み部分で前のページからPOSTされた情報に対して、 条件式を使い「真」ならそのページを表示、 偽の場合にはresponse.sendRedirect("URL");で別ページへジャンプをさせようと考えています。 その際に条件の判定に定数を使用したいのですが、 その定数は他のページでも使用する場合があるため、 C言語のヘッダーファイルのように、 別ファイルを用意して使い回しをしたいのですが… //test.h----------------------------- #pragma once const int CHECK_NUM = 15; //----------------------------------- //test.c #include <stdio.h> #include "test.h" int main(){ int n = 10; if(n < CHECK_NUM){ //真 } else{ //偽 } return 0; } このようにすればC言語では外部にかかれた定数を使用することができると思うのですが JSP,JAVAともに未経験のため詰まっています。(目下勉強中です) JSPで同様のことをするにはどのようにしたらよいのか教えていただきたいです。 質問をするにあたり情報の不足などがあるかもしれません。 その際にはお手数ですが、解答にてご指摘いただけると助かります。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • C言語のヘッダーファイルの意味と使い方

    現在、C言語を学習ちゅうです。以下のヘッダーファイルの意味と使い方、後、読み方も教えて下さい。 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <tchar.h> #include <ctype.h> #include <string.h> 後、カウンター変数の意味と使い方も知りたいです。

  • ヘッダファイルの有効範囲

    現在OpenGLを使ったプログラムを作っていて, hoge.hというヘッダファイルで #include <GL/glut.h> piyo.hというヘッダファイルには #include "hoge.h" そしてさらにhogehoge.hというヘッダファイルに #include "piyo.h" として, hogehoge.cppのソースファイルにて #include "hogehoge.h"してOpenGLの関数を使おうとしたら エラーが出ました. hogehoge.cppでhogehoge.hをインクルード →hogehoge.hでpiyo.hをインクルード →piyo.hでhoge.hをインクルード →hoge.hでGL/glut.hをインクルード というように,橋渡し的にインクルードはできないのでしょうか? これはこのような仕様なのでしょうか? それとも他に誤りがある可能性があるのでしょうか… 非常に困っております. ご回答お待ちしております.

専門家に質問してみよう