• ベストアンサー

分割コンパイルの方法がわかりません‥(Studio.NET) →2

先ほどはありがとうございました。 私の考え方が違っていたようで、 main.cpp で使っているグローバル変数をsub.cpp内で使いたい。 sub.cpp に記述している関数をmain.cppから呼び出したいときは どうしたらいいでしょうか? ヘッダファイルの書き方がわからないのです>< XPでStudio.NETでプログラミングしています。 よろしくお願いします><

質問者が選んだベストアンサー

  • ベストアンサー
  • ddnp009
  • ベストアンサー率25% (15/58)
回答No.2

#include<・・・>によって、どのような動作を 指示したことになるのか理解できれば、 今お持ちの疑問は払拭されると思いまふ。 -- sub.h -- #ifndef _SUB_H_INCLUDED_HOGEHOGE #define _SUB_H_INCLUDED_HOGEHOGE void sub_write(void); #endif // _SUB_H_INCLUDED_HOGEHOGE -- sub.cpp -- #include <stdio.h> #include "sub.h" extern char global_a[100]; // どっかで宣言されてることをコンパイラに知らす void sub_write(void){  printf("global value : '%s'\n", global_a); } -- main.cpp -- #include <string.h> #include "sub.h" char global_a[100]; int main(void){ //sprintf(a, "hello.");  strcpy(global_a, "hello");  sub_write();  return 0; }

yumichongu
質問者

補足

#1様、#2様、わかりやすい説明ありがとうございます。 教えていただいたとおりやったらできましたが、教えていただいたとおりの手順に沿って 私の書いているプログラムに適応させると 1行の警告と1行のエラーがでてコンパイル出来ません。 教えていただいた通りに書いているつもりなのですが・・・。 main.cppとhyoujun.cppとmain.hの3つのファイルを用いています。 warning LNK4075: /EDITANDCONTINUE は /INCREMENTAL:NO の指定によって無視されます。 error LNK2005:"void (__cdevl** hyoujun)(void)" (?hyoujun@@3PAP6AXXZA)は既にhyoujun.objで定義されています。 です。どうなっているのでしょうか><

その他の回答 (5)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.6

色々と端折って言うと、 #include "aaa.h" と書くと、その場所にaaa.hの中身を書いたことになります。 ヘッダの中身を一度ソースに移して、間違いがあったら(2重定義など)なおし、その上で共通部分をヘッダに落としてはいかがかしら

回答No.5

void (*hyoujun[])( void ) = { hyoujun_detail0, hyoujun_detail1, ... } これは実装(定義)なのでヘッダに置いてはなりません。 ヘッダに書けるのは↓これだけ。 extern void (*hyoujun[])( void );

  • moritan2
  • ベストアンサー率25% (168/670)
回答No.4

普通は、変数や関数の実体の記述は .cpp で行い、.h では extern で宣言します。 たとえば、main.cppで char a[100]; main.hで extern char a[100]; とすれば main.h をインクルードしておけば、a を使えます。 関数も同じように extern で宣言してやれば他のソースから使えます。 しかし、これは C++ の基本的なことなので、こういう所で質問する前に、ちゃんと入門書で勉強された方がいいとおもいます。

回答No.3

> main.cppとhyoujun.cppとmain.hの3つのファイルを用いています。 > ... > error LNK2005:"void (__cdevl** hyoujun)(void)" (?hyoujun@@3PAP6AXXZA)は既にhyoujun.objで定義されています。 main.h を提示してください。 このなかに(宣言ではなく)実装が含まれている可能性大です。

yumichongu
質問者

補足

ちょっと長いのですが・・。こちらです。 #ifndef _MAIN_H_INCLUDED_HOGEHOGE #define _MAIN_H_INCLUDED_HOGEHOGE void waip(int waip1,int waip2); void outchar0(char str1[300],char str2[300]); void outchar1(char str1[300],char str2[300]); void hyoujun_detail0( void ); void hyoujun_detail1( void ); void hyoujun_detail2( void ); void hyoujun_detail3( void ); void hyoujun_detail4( void ); void hyoujun_detail5( void ); void hyoujun_detail6( void ); void hyoujun_detail7( void ); void hyoujun_detail8( void ); void hyoujun_detail9( void ); void hyoujun_detail10( void ); void hyoujun_detail11( void ); void hyoujun_detail12( void ); void hyoujun_detail13( void ); void hyoujun_detail14( void ); void hyoujun_detail15( void ); void hyoujun_detail16( void ); void hyoujun_detail17( void ); void (*hyoujun[])( void ) = { hyoujun_detail0, hyoujun_detail1, hyoujun_detail2, hyoujun_detail3, hyoujun_detail4, hyoujun_detail5, hyoujun_detail6, hyoujun_detail7, hyoujun_detail8, hyoujun_detail9, hyoujun_detail10, hyoujun_detail11, hyoujun_detail12, hyoujun_detail13, hyoujun_detail14, hyoujun_detail15, hyoujun_detail16, hyoujun_detail17, } ; #endif // _MAIN_H_INCLUDED_HOGEHOGE よろしくお願いします><

回答No.1

---- sub.h --- #ifndef SUB_H__ #define SUB_H__ void sub(); #endif --- sub.cpp --- #include "sub.h" void sub() { // sub() を実装する } --- main.cpp --- #include "sub.h" int main() { sub(); // sub()を呼ぶ }

関連するQ&A

  • 分割コンパイルの方法がわかりません‥(Studio.NET)

    mainとsubという2つのcppファイルと各ヘッダファイルで分割コンパイルを試みましたがうまくいきません・・。 何が間違っているのでしょう・・。 エラーメッセージ error LNK2005: "char * a" (?a@@3PADA)は既にmain.objで定義されています。 fatal error LNK1169: 1つ以上の複数回定義されているシンボルが見つかりました。 と表示されます。ファイルソースは以下です。どなたか教えてください>< ----------(main.h)---------- char a[100]; ----------(main.cpp)---------- #include<stdio.h> #include "main.h" #include "sub.h" int main(){  sprintf(a,"hello.");  sub_write();  return 0; } -----------(sub.h)----------- void sub_write(); -----------(sub.cpp)------------- #include <stdio.h> #include "main.h" #include "sub.h" void sab(){  printf("%s\n",a); } return; }

  • 複数ファイルによる共通の外部変数定義について

    初歩的な質問なのですが、今各関数をファイルごとに分けて記述しようとしています。 ここで詰まっているのでできればご教授お願いします ファイル構成は プログラムファイル main.cpp sub.cpp ヘッダーファイル  myheader.h(main.cppとsub.cpp両方でインクルード) ヘッダーファイルには両方のプログラムファイルで使う変数が定義してあります。 それでmain.cppとsub.cpp両方で同じ変数を使いたいのですがコンパイルエラーが発生してしまいます。 内容はsub.obj側で「i(共通のループカウンタ)はmain.objですでに定義されています」というものです。 とにかく私のやりたいことはヘッダーに外部変数を定義して両方のプログラムファイルで使いたいというものです。 もしかしたらファイルを分けるにも何か設定が必要なのでしょうか? 私はただ[プロジェクト]→[プロジェクトに追加]→[新規作成]でソースファイルを作っているだけなんですが・・・ 上記の状態を回避する方法はあるのでしょうか?

  • gccでの分割コンパイルについて

    参考書に分割コンパイルの方法が書いてなかったので質問させていただきます。 現在3つのソースファイルがあります。 1.header.h (関数プロトタイプ宣言) 2.kansu.c  (関数の定義) 3.main.c  (main()関数) ここで、main.cがheader.hをincludeしています。 このときの分割コンパイルはどのようにしたら良いのでしょうか?Makefileを作成するのでしょうか? 自分自身分割コンパイルの経験はありません。 環境は Cygwinを使ってのWindows XP コンパイラはgcc もうひとつは Visual Studio.netを使っての環境です。

  • プログラムのファイル分割。

    現在C++を学んでいるものです。 ソースファイルの分割についての質問です。よろしくお願いします。 環境はVisual Studio 2005です。 ファイルを      myheader.h      main.cpp      function.cpp と分ける事を考えると、例えば単純な int max(int num1, int num2){ if(num1 > num2) return num1; else return num2; } という関数を考えた場合、 myheader.hには関数maxの宣言int max(int num1, int num2);を。 function.cppには上記の関数maxの内容を。 そしてmain.cppで関数maxを使用するといったように分割し、実行することまでは自分でできます。 ですが、上記の関数をテンプレートを使って、どの型でも使用可能にするには、myheader.h、function.cppにはどのように記述したらよいでしょうか? テンプレートを使った関数は普通ですが、 template <class T> T max(T num1, Tnum2){ if(num1 > num2) return num1; else return num2; } というように記述したいと考えています。 よろしくお願いします

  • Visual Studio2008で簡単にプログラムを組む方法を教えてください

    お世話になります。c++初心者です 現在Visual Studio2008でc++のプログラムを組んでいるのですが、 ソースファイルフォルダの下に2つ以上プログラムがあると、 それらをまとめて処理してしまうようで、できれば、 a1.cpp,a2.cpp,というように、分割してコンパイル&実行したいのですが、 そのような方法は可能でしょうか? 本来ならば、フリーのソフトで実行すればよいのですが、 どうもそれに見合うものがなく、Visual Studioを使っています。 状況は、プロジェクトの下に、ソースファイルフォルダ、 ヘッダーファイルフォルダ、リソースファイルフォルダがあり、 ソースファイルフォルダに新しい項目を追加する形で、記述しています。 よろしくお願いいたします。

  • 分割コンパイルでのファイル利用について

    分割コンパイルする際、例えばsub.cで fpi=fopen(argv[1], "rb") のようにファイルを開き、それを別のmain.cで 引き続き利用したい場合、どのようにして引き渡せば良いでしょうか? ヘッダファイルを利用してみたのですが、なぜか実行すると 「外部シンボル'_fpi'が未解決」などとエラーが出てしまいます。 ヘッダファイルについては、head.hに extern FILE *fpi,*fpo; と 入れておいて、main.cとsub.cに #include "head.h" を入力してある状態です。 使っているのは Microsoft Visual C++ Express Editionです。 よろしくお願いします。

  • C++ visualstudio グローバル変数

    C++のプログラミングに関する質問です。 visual studio2008を使用しています。 手元に非常に複雑なC++ファイルなどから構成されている1つのprojectがあります。(ヘッダファイルなどもあります) そのため、このprojectをデバッグすると、A.cppファイルをデバッグ→B.cppファイルをデバッグ→A.cppファイルをデバッグ→C.cppファイルをデバッグのように、色々なcppファイルを跨ってデバッグします。 1つのcppファイルには大量の関数があり、cppファイルの先頭や,関数外の部分に例えばA.cppで int test などと宣言すれば、A.cppファイル内ではtestと名付けた変数をすべての関数で使えます。 しかし、あくまでA.cppファイル内だけで使用できるだけで、別のBやC.cpp内で使うことはできません。 このtest変数をB.cppやC.cppファイルでも使えるようにするにはどうすればいいでしょうか? 上で挙げた例でいうなら、A.cppからB.cppファイルに移動する際の関数の引数として渡す方法は考えられますが、実際には、 test変数を使いたいのはかなり後に登場するcppファイルで関数の引数として扱うのは非常に大変です。 (Z.cppでtest変数を使いたい。しかしZ.cppに到達するまでにはA~Y.cppを通り、その間に登場するすべての関数でtestを引数にしなければならない) 関数の引数でtest変数を使えるようにする以外の方法がありましたたら教えていただけると幸いです。 実際にやりたいことは A.cpp内にある関数が実行されたらその数をカウントし(A.cppのこの関数は何度も呼び出される関数) //count ++ このcount++の値によってZファイルのある関数での動作を変えたいと思っています。 if(count<100){ printf("aaa"); } しかし、現状ではZ.cppファイル内ではcountが定義されていないので上のようなif文を書くとエラーになってしまいます。

  • プログラムファイルの分割で…

    C++ でプログラムファイルを分割するとき,疑問に思うことがあります。 私はいつも,分割ファイルはヘッダファイルのみ用意しています。 関数の定義などすべてを,ヘッダファイルの中に書き込みます。 しかしキチンとしたプログラミングの本には   XXX.cpp   XXX.h と,二種類のファイルで分割ファイルを作成しています。 簡単なクラスしか作らないので,私は   XXX.h のみ用意して,簡単に使いたいのです。 私の方法でエラーなどが出たことはありませんが, 方法として,あまりオススメできないものなのでしょうか。

  • C++のファイル分割でのエラーについて

    最近VC2008でC++の勉強を始めたのですが、ファイル分割でLNK2005エラーというのが発生し、解消できません。 インクルードガードは行ったのですが、どうしたらよいのか分かりません。 ソースコードはこんな感じです。 //main.cpp #include "sub.h" #include "res.h" bool main(){ calcx(m_x); calcy(m_y); } //res.h 共有変数の宣言 #ifndef __RES_H #define __RES_H int m_x; int m_y; #endif //sub.h 関数のプロトタイプ宣言を行う void calcx(); void calcy(); //sub.cpp 関数の定義を記述する #include "res.h" void calcx(int x){ m_x = x + 100; } void calcy(int y){ m_y = y + 200; } エラー: 1>Main.obj : error LNK2005: "int m_x" (?m_x@@3HA) は既に sub.obj で定義されています。 1>Main.obj : error LNK2005: "int m_y" (?m_y@@3HA) は既に sub.obj で定義されています。 上記のようなエラーを解消するにはどうしたら良いのでしょうか。 何がおかしいのか指摘をお願いします。

  • cppファイルを直接visual studioで開き、ビルドするには?

    cppファイルを直接visual studioで開き、ビルドするには? 私はvisual studio 2008を使ってプログラミングをしています。 いつもみたいに、プロジェクト作成→cppファイル作成って流れでやると普通に(ビルドやデバッグが)できるのですが、 プロジェクトを作成せず、裸のcppファイルだけをvisual studioで開くと、ビルドとか何もできません。実行して、コンソール画面を出したいのですが…。 出来る方法はあるのでしょうか? また、どうしてこの方法ではできないのかも、教えてくれるとありがたいです。 よろしくお願いします。