名前空間について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
きらりん

名前空間について

#1

投稿記事 by きらりん » 16年前

前日に立てたスレッドでは、お世話になりました!
教えてもらった方法でファイル分割はできるようになったんですが、新たな壁にぶちあたりました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:名前空間について

#2

投稿記事 by たいちう » 16年前

test.hというファイルを作り、main.cppからはこのファイルをインクルードすればよいでしょう。
詳しくは下記サイトに。

http://www7b.biglobe.ne.jp/~robe/cpphtml/index.html
http://www7b.biglobe.ne.jp/~robe/cpphtm ... 01070.html

きらりん

Re:名前空間について

#3

投稿記事 by きらりん » 16年前

聞いておきながら、帰省という罠を忘れていて返信大変遅れました・・・。
本当に申し訳ないです。

上記サイトを読んでもよくわからなかったのですが、名前空間を使ったファイルを読み込ますには、拡張子.hファイルの方が良いということなのでしょうか。。。

紅葉

Re:名前空間について

#4

投稿記事 by 紅葉 » 16年前

素人の知識で申し訳ないのですが
test.hを作成しここにkansu関数のプロトコル宣言をします。
これをmain.cpp でインクルードしてください。
ご存知でしたら申し訳ありませんがプロトコル宣言とは 

void kansu(void);

みたいに書き処理の使用前に処理を書かなくても使えるようにすることです。

きらりん

Re:名前空間について

#5

投稿記事 by きらりん » 16年前

僕の質問の仕方が間違ってるのかな・・・;
自作関数の話じゃなくて、namespaceの話です><

初級者

Re:名前空間について

#6

投稿記事 by 初級者 » 16年前

>紅葉さん

言わずもがなですが、
プロトコル宣言
ではなくて
プロトタイプ宣言
です。

GPGA

Re:名前空間について

#7

投稿記事 by GPGA » 16年前

//********************************************
// 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:名前空間について

#8

投稿記事 by きらりん » 16年前

>>GPGA様
このソースのおかげで皆様が言っていた意味がやっとわかりました!
プロトタイプ宣言の中にもnamespaceを書かないといけなかったんですね・・・。

using namespaceは実際自分でやりたいと思ってることをするときは使わないのですが、この例ではあったほうが書きやすいかなと思って書いてました。余計わかりにくくなったみたいですみません;

閉鎖

“C言語何でも質問掲示板” へ戻る