前日に立てたスレッドでは、お世話になりました!
教えてもらった方法でファイル分割はできるようになったんですが、新たな壁にぶちあたりましたorz
ある.cppファイルで宣言したnamespace内の関数をmain内で使用しようと思ったのですがよくわからないエラーがでて困ってます;
こんな感じのことをしてみました。
//********************************************
//test.cpp
//********************************************
#include "Dxlib.h"
namespace test {
void kansu() {
DrawFormatString(0,20,GetColor(255,255,255),"test");
}
}
//********************************************
//main.cpp
//********************************************
#include "DxLib.h"
#include "GV.h"
using namespace test;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数
if( DxLib_Init() == -1 ) return -1;//初期化処理する関数
while(!ProcessMessage() && !ClearDrawScreen() && CheckHitKey( KEY_INPUT_ESCAPE ) == 0){
ClearDrawScreen();
kansu();
wait_fanc();
fps();
ScreenFlip();
}
DxLib_End() ;//終了処理をする関数
return 0 ;
}
//********************************************
という感じです。
するとエラーが、
error C2871: 'test' : この名前を指定された名前空間は存在しません。
error C3861: 'kansu': 識別子が見つかりませんでした
とでてしまいました・・・。
また、test.cppをincludeしてみたら良いのかなと思ってmainでincludeしてみると
error LNK2005: "void __cdecl test::kansu(void)" (?kansu@test@@YAXXZ) は既に main.obj で定義されています。
fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
コンパイルについてよくわかってないんですが、cppは勝手に読み込まれるものなのかなと思って、ファイル名を.h(test.h)にしたものをmainでincludeしてコンパイルしてみたらコンパイルが通りました。
しかしこれで書くのはおかしいんじゃないか・・・と思って色々調べたんですがわかりませんでした;
名前空間について
Re:名前空間について
test.hというファイルを作り、main.cppからはこのファイルをインクルードすればよいでしょう。
詳しくは下記サイトに。
http://www7b.biglobe.ne.jp/~robe/cpphtml/index.html
http://www7b.biglobe.ne.jp/~robe/cpphtm ... 01070.html
詳しくは下記サイトに。
http://www7b.biglobe.ne.jp/~robe/cpphtml/index.html
http://www7b.biglobe.ne.jp/~robe/cpphtm ... 01070.html
Re:名前空間について
聞いておきながら、帰省という罠を忘れていて返信大変遅れました・・・。
本当に申し訳ないです。
上記サイトを読んでもよくわからなかったのですが、名前空間を使ったファイルを読み込ますには、拡張子.hファイルの方が良いということなのでしょうか。。。
本当に申し訳ないです。
上記サイトを読んでもよくわからなかったのですが、名前空間を使ったファイルを読み込ますには、拡張子.hファイルの方が良いということなのでしょうか。。。
Re:名前空間について
素人の知識で申し訳ないのですが
test.hを作成しここにkansu関数のプロトコル宣言をします。
これをmain.cpp でインクルードしてください。
ご存知でしたら申し訳ありませんがプロトコル宣言とは
void kansu(void);
みたいに書き処理の使用前に処理を書かなくても使えるようにすることです。
test.hを作成しここにkansu関数のプロトコル宣言をします。
これをmain.cpp でインクルードしてください。
ご存知でしたら申し訳ありませんがプロトコル宣言とは
void kansu(void);
みたいに書き処理の使用前に処理を書かなくても使えるようにすることです。
Re:名前空間について
//******************************************** // test.h //******************************************** #ifndef INCLUDE_TEST_H #define INCLUDE_TEST_H namespace test { void kansu(); } #endif // INCLUDE_TEST_H //******************************************** // test.cpp //******************************************** #include "Dxlib.h" #include "test.h" namespace test { void kansu() { DrawFormatString(0,20,GetColor(255,255,255),"test"); } } //******************************************** //main.cpp //******************************************** #include "DxLib.h" #include "GV.h" #include "test.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数 if( DxLib_Init() == -1 ) return -1;//初期化処理する関数 while(!ProcessMessage() && !ClearDrawScreen() && CheckHitKey( KEY_INPUT_ESCAPE ) == 0){ ClearDrawScreen(); test::kansu(); wait_fanc(); fps(); ScreenFlip(); } DxLib_End() ;//終了処理をする関数 return 0 ; }
元のソースでusing namespaceを使っていますが
using namespaceを使うなら、最初からnamespace使わなければいいのでは?
Re:名前空間について
>>GPGA様
このソースのおかげで皆様が言っていた意味がやっとわかりました!
プロトタイプ宣言の中にもnamespaceを書かないといけなかったんですね・・・。
using namespaceは実際自分でやりたいと思ってることをするときは使わないのですが、この例ではあったほうが書きやすいかなと思って書いてました。余計わかりにくくなったみたいですみません;
このソースのおかげで皆様が言っていた意味がやっとわかりました!
プロトタイプ宣言の中にもnamespaceを書かないといけなかったんですね・・・。
using namespaceは実際自分でやりたいと思ってることをするときは使わないのですが、この例ではあったほうが書きやすいかなと思って書いてました。余計わかりにくくなったみたいですみません;