c++ 에서요 .. 하나의 namespace 사용법 좀 ..

naddolki의 이미지

제목 그대로입니다 ㅠㅠ

klara의 이미지

namespace는 아무데서나 만들수 있고, 이름만 같으면 됩니다.
다른 파일에서도 똑같은 방법으로 작성하면됩니다.

해더파일의 확장자는 아무거나 상관없습니다만, 보통은 .h 혹은 .hpp를 이용합니다.

naddolki의 이미지

하나의 프로젝트에서 ..
한 쪽의 파일에 작성된 namespace 를 ..
다른 쪽 파일에서 .. 사용할 수 있는지 .. 궁금합니다 ;

여러가지 방법으로 시도해 봤는데 .. 오류가 나서 ..
질문 드립니다 .

그리고, 헤더파일은 .. ;;
음 .. 아닙니다 .
제가 말을 조리 있게 못하다 보니 ..
질문의 의도와는 그다지 상관없는 쪽으로 ..
다른 쪽으로 받아들이신 것 같습니다 ^^ ;;

한 쪽의 파일에 작성된 namespace 를 ..
다른 쪽 파일에서 .. 사용하는 방법을 알고 계시면 좀 알려주셔요 .

설연희 입니다 ^ ㅡ^ㅋ

설연희 입니다 ^ ㅡ^ㅋ

klara의 이미지

'namespace를 사용한다'는 건 예를 들면 A라는 네임스페이스 안에 정의된 함수 a를 다른 파일에서 어떻게 호출하느냐는 뜻인가요?

naddolki의 이미지

네 .. 가령 ..
아래와 같이 file1.cpp 그리고 file2.cpp 로 구성된 프로젝트를 ..
컴파일하는 경우에요 ..

// file1.cpp

namespace ns
{
int x;
}

// file2.cpp

main()
{
ns::x = 1; // 오류 : "ns 는 클래스나 네임스페이스 이름이 아닙니다"
}

위의 경우 .. 오류가 나길래 ...

// file1.cpp

namespace ns
{
int x;
}

// file2.cpp

extern int ns::x;

main()
{
ns::x = 1; // 오류 : "ns 는 클래스나 네임스페이스 이름이 아닙니다"
}

이렇게 되네요 ;;

file1.cpp 에 있는 ns::x 를 ..
file2.cpp 에서 사용하는 방법을 알고 싶어요 ;;

관심가져 주셔서 대단히 감사합니다 .

설연희 입니다 ^ ㅡ^ㅋ

설연희 입니다 ^ ㅡ^ㅋ

hys545의 이미지

tmp.h
만들고

그 안에 단순히
namespace ns {};\
하면 될거 같은데
아니면

file2.cpp
에서
namespace ns;
앞에 써주면 안 될려나.

즐린

antaran의 이미지

namesace ns
{
int x ;
}

와 같이 namespace 정의부를 헤더로 빼시고 include하시면 되는 것을 모르셔서

질문을 하셨을 것 같지는 않고...

그래도 답은 저것밖에 없지 않나 싶은데요.

naddolki의 이미지

좋은 의견 남겨주신 분들께 진심으로 감사드립니다 .
종일 생각해 본 결과를 말씀드리겠습니다 .

일단, 실제 메모리에 놓이게 될 인스턴스(변수 선언, 함수 정의 따위)는 네임스페이스에 두지 않는 게 적절한
사용법인 것 같습니다 .
네임스페이스는 전역 정의만 가능하므로, 네임스페이스로 정의한 요소들은 "전역성" 을 띄고 있습니다 .
따라서, 네임스페이스 정의를 헤더파일에 위치시킬 때에는 .. 해당 헤더파일이 여러 파일에 인클루드 될 때 ..
"충돌" 이 발생할 수 있는 요소들 (즉, not static 전역변수의 선언 / not static 함수의 정의 .. 따위) 이 ..
네임스페이스에 포함되어 있지 않도록 .. 주의해서 작성해야 합니다 .

네임스페이스에 굳이 .. 권하지 않는 요소들을 포함시켜야 할 때는 ..
아래와 같이 해주시면 됩니다 .

/******** ns.cpp (네임스페스가 정의되어 있는 파일 *******/

namespace ns // 네임스페이스 정의
{
int x; // 전역 변수
int y; // 전역 변수
}

/******** ns.h (헤더파일) *******************************/

namespace ns // 외부 연결을 위한 네임스페이스 정의
{
extern int x;
extern int y;
}

/******** main.cpp **************************************/

#include ns.h

extern void incOne(void);

void main(void)
{
ns::x = 1; // ok
ns::y = 10; // ok

incOne(); // ok
}

/******** sec.cpp ***************************************/

#include ns.h

void incOne(void)
{
ns::x++; ns::y++; // ok
}

설연희 입니다 ^ ㅡ^ㅋ

설연희 입니다 ^ ㅡ^ㅋ

아메스트리에우려먹은사골맹탕의 이미지

extern 이 헤더에 쓰인 게 단순히 다른 cpp 에 코드 카피로 사용된 건데...
다른 곳에서 중복 선언이 됐다면 extern 이 원하는대로 동작할 지 궁금하군요.
선언을 1번만 해도 되는 걸 굳이 두 곳에 나눠서 하는 게 귀찮기도 하고 위험할 것 같은데요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.