- ベストアンサー
分割コンパイルの方法がわかりません‥(Studio.NET) →2
先ほどはありがとうございました。 私の考え方が違っていたようで、 main.cpp で使っているグローバル変数をsub.cpp内で使いたい。 sub.cpp に記述している関数をmain.cppから呼び出したいときは どうしたらいいでしょうか? ヘッダファイルの書き方がわからないのです>< XPでStudio.NETでプログラミングしています。 よろしくお願いします><
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#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; }
その他の回答 (5)
- Trick--o--
- ベストアンサー率20% (413/2034)
色々と端折って言うと、 #include "aaa.h" と書くと、その場所にaaa.hの中身を書いたことになります。 ヘッダの中身を一度ソースに移して、間違いがあったら(2重定義など)なおし、その上で共通部分をヘッダに落としてはいかがかしら
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
void (*hyoujun[])( void ) = { hyoujun_detail0, hyoujun_detail1, ... } これは実装(定義)なのでヘッダに置いてはなりません。 ヘッダに書けるのは↓これだけ。 extern void (*hyoujun[])( void );
- moritan2
- ベストアンサー率25% (168/670)
普通は、変数や関数の実体の記述は .cpp で行い、.h では extern で宣言します。 たとえば、main.cppで char a[100]; main.hで extern char a[100]; とすれば main.h をインクルードしておけば、a を使えます。 関数も同じように extern で宣言してやれば他のソースから使えます。 しかし、これは C++ の基本的なことなので、こういう所で質問する前に、ちゃんと入門書で勉強された方がいいとおもいます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> main.cppとhyoujun.cppとmain.hの3つのファイルを用いています。 > ... > error LNK2005:"void (__cdevl** hyoujun)(void)" (?hyoujun@@3PAP6AXXZA)は既にhyoujun.objで定義されています。 main.h を提示してください。 このなかに(宣言ではなく)実装が含まれている可能性大です。
補足
ちょっと長いのですが・・。こちらです。 #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 よろしくお願いします><
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
---- 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()を呼ぶ }
補足
#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で定義されています。 です。どうなっているのでしょうか><