[C++] 이름공간으로 분리된 함수의 선언/정의가 가능한가요?

gurumong의 이미지

C++을 공부하고 있습니다
네임스페이스를 공부하면서 머리속이 많이 복잡해지는데요
표준에서 아래와 같이 함수의 선언과 정의가 서로 다른 이름공간으로 분리되어 사용되는것도 가능한가요?

// module.h
namespace A
{
  extern int var;
  int func(void); //네임스페이스A에서 함수선언
}

// module.cpp
#include "module.h"
int var = 10;
 
namespace B
{
  using namespace A; //using 지시어로 네임스페이스A 사용
 
  int func(void) //네임스페이스B에서 함수정의
  {
    return ++var;
  }
}

// main.cpp
#include "module.h"
using namespace A;
 
int main(void)
{
  func(); //네임스페이스A에서 선언되고, 네임스페이스B에서 정의된 함수 사용
}
winner의 이미지

해봤더니 안 되는군요.

라스코니의 이미지

선언과 정의가 각각 다른 namespace 에서 define 되어도 가능한지 테스트해 보실려는 것 같은데요.

그런게 가능하지는 않을 것 같네요. 그런게 가능하다면 COM 같은게 나오지 않았겠죠.

winner의 이미지

COM을 몰라서...

neogeo의 이미지


// module.cpp
#include "module.h"
int var = 10;
 
namespace B
{
}
 
int A::func(void) //A 보다 상위 scope의 namespace에서 A 의 함수정의 ( 이경우는 global )
{
  return ++::var;
}

로 작성하면 됩니다. 같은 level의 다른 namespace scope 안에서는 일단 안되는 걸로 알 고 있습니다. 하나 상위 레벨 namescope 에선 대체적으로 문제 없었습니다.
Neogeo - Future is Now.

Neogeo - Future is Now.

shint의 이미지

//이런게 나은거 같습니다.
- namespace 안에 namespace 보다는 class와 상속을 사용하는 방식
- COM GUID가 namespace 역할.을 하나봅니다. 이것은 AFX의 GUID와도 연관되어 보입니다.

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/c8aea791-0926-4fbd-a4c5-a658cd0a9b1b
http://www.hanb.co.kr/ebook/look.html?src=email&kw=0000BA&ACENO=7&isbn=9788979149456
http://msdn.microsoft.com/en-us/library/h627s4zy.aspx
http://stackoverflow.com/questions/5978981/c-namespace-versioning
http://stackoverflow.com/questions/5966647/c-namespace-question
http://snslab.kangwon.ac.kr/home/?bo_table=openclass&doc=bbs/gnuboard.php&wr_id=59

// main.cpp
#include "module.h"
 
int main(void)
{
	A::n1 = 4;
	B::n1 = 3;
	A::func(30);
	B::func(40);
	return 0;
}
 
 
// module.cpp
 
#include <stdio.h>
 
#include "module.h"
 
using namespace A;
using namespace B;
 
 
int var = 10;
 
//
int A::var = 5;
int B::var = 15;
 
 
int __cdecl A::func(int a)
{
	printf("A::fn\n");
	printf("var    : %d\n", var);
	printf("A::var : %d\n", A::var);
	printf("B::var : %d\n", B::var);
	printf("a : %d\n", a);
	printf("n1 : %d\n", n1);
	printf("::var    : %d\n", ::var);
	printf("\n");
	++B::var;
	return ++var;
}
 
 
int __cdecl B::func(int a)
{
	printf("B::fn\n");
	printf("var    : %d\n", var);
	printf("A::var : %d\n", A::var);
	printf("B::var : %d\n", B::var);
	printf("a : %d\n", a);
	printf("n1 : %d\n", n1);
	printf("::var    : %d\n", ::var);
	return ++A::var;
}
 
// module.h
namespace A
{
	extern int var;
	static int n1;
	int __cdecl func(int a);
}
 
 
namespace B
{
	extern int var;
	static int n1;
	int __cdecl func(int a);
}

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.