• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語でヘッダファイルにグローバル変数を宣言する)

C言語でヘッダファイルにグローバル変数を宣言する方法と注意点

yusakai0220の回答

回答No.1

"static"を利用しているためです。 "static" は,関数内で使用される場合,同じ関数が実行される限り同一のメモリに割り当てられるですが, 関数外で使用される場合は,同一ファイル上からのみ参照できるという意味になります。 main.hに"static int a;"としているので,"a"はmain.h内でのみ参照できることになります。 つまり,main.cからはアクセス出来ません。 main.hで宣言をしたい場合は,"int a;"としましょう。 どうしても,"static"を使用したい場合は, main.cのなかに記述して下さい。

関連するQ&A

  • C言語でヘッダファイルを自作する

    C言語で#defineを用いてヘッダファイルを作成したのですが、 作成したコンパイルするときにヘッダファイルがオープンできません。 参考にしている資料があるのですが、そこに書かれているサンプルプログラムを 丸ごとコピーして作ったプログラムも同様にヘッダファイルがオープンできない というエラーが出るので、ヘッダファイルを定義する方法そのものが間違っていると 思うのですが、どこが間違っているのでしょうか? よろしければ正しい記述方法もお教えください。 #include <stdio.h> #if !defined SAMPLE_H #define SAMPLE_H wa(int a, int b) { return a+b; } #endif #include "sample.h" int main(){ printf("%d\n",wa(40,70)); return 0; } ヘッダファイルの定義の方法は他にもあるとは思いますが、 今回は#defineを用いた方法でお願いします。

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

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

  • ヘッダファイルとは?

    ヘッダファイルを作って、そこに構造体を送りたいのですが、 「引数宣言は 'data' で始められない」というエラーがヘッダファイル側で起きてしまいます。 main()で作ったからいけないのでしょうか? 分かる方教えていただけませんか? #include<stdio.h> #include "Max_Score.h" /*構造体の宣言*/ typedef struct data{ ・・・・・; }DATA; void main(){ DATA data[50]; ・・・・・・・・; Max_Score(data); } /*Max_Score()側*/ void Max_Score(data *p){ ・・・・・; }

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

    前回のC言語のコンパイラの質問で、たくさんのご回答ありがとうございました。 おかげさまでコンパイラはなんとかなりそうですが、ひょっとしたらまた同じ質問を載せるかもしれません(^^; 今回はC言語のヘッダファイルを自分で作ってみたいんですが、よくわかりません。 microsoft visual studioのvisual c++付属のINCLUDEフォルダにある、stdio.hを開いてみたのですが、基本のprintf()やscanf()なども、どう定義されているか わからず終いでした。本などでもいまいち詳しく書いていなく(そう思うのは僕だけ?)、困っています。c言語のヘッダファイルとc++のヘッダファイルは やっぱり別ものなんでしょうか?ご回答おまちしております。

  • C言語のヘッダーファイルについて

    宜しくお願い致します。 C言語について殆ど知識が無い為、変な質問でしたらすみません。 あるソースをビルドしてみたのですが、エラーが出てしまいます。 fatal error C1083: インクルード ファイルがオープンできません。'ヘッダーファイル名': No such file or directory このエラーが出るのは、以下のファイルです。 <sys/socket.h> <netdb.h> <netinet/in.h> <sys/param.h> <sys/uio.h> <unistd.h> これらのファイルは一体何処にあるのでしょうか。 どうすればこのエラーは消えるのでしょうか・・・

  • C言語のヘッダーファイルの作成方法

    Cの初心者です、宜しくお願いします。 下のようなヘッダを作成して、別のファイルに#includeして、走らせて見ました。 そこで疑問点ですが、 「mm」については置き替えが出来て、計算処理をしているのですが、「mm」の型宣言をしていません、これでもエラーにならないのは何故でしょうか。 普通に「mm」という変数とした場合(「mm」をヘッダーとして#includeしなかった場合)にはint型を宣言していないとエラーになると思うのですが。 また、「hh」については、そのまま「hh」がprintfされています。 文字の場合の置き替えは、使えないということでしょうか。 宜しくお願いします。 /*header_2.h*/ #define hh HEADER練習 #define mm 100 ================================================ #include "header_2.h" int main(void) { int aaa = 50 ; printf("%d\n\n" , mm); printf("hh"); printf("%d\n\n" , mm * 100); printf("%d\n\n" , mm * aaa); return 0; }

  • ヘッダファイルでのFILE型引数宣言について

    下記の(1)、(2)のファイルについての質問になります。 (1)cファイル #include <stdio.h> /******************/ /* 表示モード処理 */ /******************/ void view_mode( FILE *fp_in ) ^^^^ { char data; while( 1 ){ /* ファイルから1文字読込み */ data = fgetc( fp_in ); /* ファイルの終了かをチェック */ if(data == EOF ){ break; } /* 表示処理 */ printf( "%c", data ); } return; } (2)ヘッダファイル void view_mode( FILE *fp_in ); ^^^^ ◆質問内容 (1)にview_modeの処理を書き、(2)にview_modeのプロトタイプ宣言をしていますが、 (1)はコンパイルが通るのですが、(2)はコンパイルが通りません。 エラー内容を見ると、 エラー E2147 testddga.c 1: 引数宣言は 'FILE' で始められない と表示されてしまいます。 (1)では、引数宣言にFILEを使用しているのにコンパイルが通り、 (2)では、何故かはコンパイルが通らないので、疑問に思っております。 お手数ですが、ご教授の程お願いたします

  • C言語 プロトタイプ宣言

    分割コンパイルした場合のプロトタイプ宣言について質問です。 以下のプログラムをコンパイルすると警告がでます。 プロトタイプ宣言は関数を利用する側と定義側両方に必要と理解していたのですが・・・ どなたか教えていただけますでしょうか。 windows7 cygwin gccでコンパイル エラーメッセージ $ gcc -o testMain.exe testMain.c testKioku.c testKioku.c:9: 警告: conflicting types for 'func1' testKioku.c:3: 警告: previous declaration of 'func1' was here testKioku.c:17: 警告: conflicting types for 'func2' testKioku.c:4: 警告: previous declaration of 'func2' was here ソース testMain.c #include <stdio.h> void func1(void); void func2(void); int cnt=5; main(){ printf("main=%d\n",cnt); func1(); func2(); } testKioku.c #include <stdio.h> void func1(void); void func2(void); extern int cnt; func1() { cnt++; printf("func1 global cnt=%d\n",cnt); func2(); } func2() { printf("func2 global cnt=%d\n",cnt); }

  • 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()が定義されていないと出るのでまったくわかりません・・・。

  • ヘッダーファイルでは、他のヘッダーファイルをインクルードできないのか

    Javaを仕事で使っています。 最近趣味でC++を始めました。色々形式の違いに戸惑っています。 C++では関数を宣言しなければならないので、クラス名と同じヘッダーファイルにそのクラスで使う関数を宣言して、それをインクルードしています。 そこで今、壁にぶちあたりました。 あるクラス(仮にFooとします)の関数で、他のクラス型(Hogeとします)を引数に取りたいので、ヘッダーファイルにそれを宣言しようとしているのですが、コンパイルエラーになってしまいます。 Foo.hは以下のような感じ。 #include Hoge.h 中略 GetHoge(Hoge hoge); コンパイルエラーでは error C2011: 'Hoge' : 'class' 型の再定義 などと言われます。 クラスとその同名のヘッダーファイル、という形式を変えずに 他のクラス型を引数にとる関数を作るには、どうしたらよいのでしょうか? C++に関しては全くの素人です。詳しい方、ご教示願います。