初歩的な質問なのですが、今各関数をファイルごとに分けて記述しようとしています。
ここで詰まっているのでできればご教授お願いします
ファイル構成は
プログラムファイル main.cpp sub.cpp
ヘッダーファイル myheader.h(main.cppとsub.cpp両方でインクルード)
ヘッダーファイルには両方のプログラムファイルで使う変数が定義してあります。
それでmain.cppとsub.cpp両方で同じ変数を使いたいのですがコンパイルエラーが発生してしまいます。
内容はsub.obj側で「i(共通のループカウンタ)はmain.objですでに定義されています」というものです。
とにかく私のやりたいことはヘッダーに外部変数を定義して両方のプログラムファイルで使いたいというものです。
もしかしたらファイルを分けるにも何か設定が必要なのでしょうか?
私はただ[プロジェクト]→[プロジェクトに追加]→[新規作成]でソースファイルを作っているだけなんですが・・・
上記の状態を回避する方法はあるのでしょうか?
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
myheader.h内で変数を定義したのでは、main.cppとsub.cppの両方で変数が定義されることになります。
ヘッダファイル内では宣言のみにしてください。具体的には、myheader.h内では「extern int i;」のように宣言し、main.cppかsub.cppのどちらか一方で「int i;」と定義してください。これでエラーがでなくなるはずです。#ただし、ループカウンタをグローバル変数にするのはどうかと思いますが...。
gimmickさん、ありがとうございます
無事コンパイルが通りました^^
しかし・・・ヘッダーファイルでは宣言だけしかしてはいけないのでしょうか?
それとプログラムファイルの中でもう一度定義しなおすのはなぜなんでしょうか?
たぶんこれもC言語では基礎的なものだとは思うのですがそちらも教えてもらえないでしょうか?
または解説ページなどがあれば紹介だけでもお願いします
今から自分でも調べてみるつもりです
>#ただし、ループカウンタをグローバル変数にするのはどうかと思いますが...。
あ、これは例えであって実際にはしてません(^-^;
No.2
- 回答日時:
>ヘッダーファイルでは宣言だけしかしてはいけないのでしょうか?
通常、ヘッダファイルでは変数の定義は行いません。複数のファイルからインクルードされた場合に重複定義のエラーとなるからです。そのため、ヘッダファイル内では宣言のみを行います。しかし、これだけだと変数の定義がありません。そのため、どこかで定義を記述する必要があります。
>または解説ページなどがあれば紹介だけでもお願いします
適当なページが思いつかないのですが、1つだけ挙げておきます。
参考URL:http://www.catnet.ne.jp/kouno/c_faq/c1.html#7
No.3
- 回答日時:
main.cpp:
#define MAIN
#include "myheader.h"
sub.cpp
#include "myheader.h"
myheader.h:
#ifdef MAIN
#define PUBLIC
#else
#define PUBLIC extern
#endif
PUBLIC int i;
これでどうでしょう。
カウンタのグローバル定義はいかがなものか?という論議の前に、ヘッダファイルをいじるならプリプロセッサ構文を理解しましょう。
プリプロセッサ構文、記憶クラスの機能を知れば「なぜカウンタをグローバル定義しない方が良いか」がわかるはずです。
もちろん、カウンタをグローバル定義した方が良いこともあります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/10 09:06
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/05/26 17:13
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
SGファイルって何ですか?
-
CSVファイルへの保存の際、デー...
-
「VBScript」ADODB.Streamにお...
-
マウスポインタの変更
-
分割コンパイルの#defineについて
-
バッチで118項目のCSVを処理し...
-
[VBScript]ファイルの入出力を...
-
VB6でのファイル作成方法
-
VBに、Cのincludeのようなもの...
-
大きいサイズのテキストファイ...
-
fopenできる上限の変更
-
同じ名前のファイルを作った場...
-
■ 移植性のないポインタ変換に...
-
プログラムで文字をBMPファイル...
-
C言語のfopenについて教えてく...
-
CSVファイル
-
Javascript で INI の読み書き
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
CSVファイルへの保存の際、デー...
-
ファイルを記録してあるセクタ...
-
テキストファイルの最終行を削...
-
SGファイルって何ですか?
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
VBに、Cのincludeのようなもの...
-
fopenできる上限の変更
-
グローバル変数のよくない使い...
-
ファイルの結合
-
大きいサイズのテキストファイ...
-
iniファイルに追記がしたいです。
-
バッチで118項目のCSVを処理し...
-
ハッシュの計算時間について
-
C言語のfopenについて教えてく...
-
Javascript で INI の読み書き
-
Excelマクロでの再読込み方法
おすすめ情報