본문 바로가기

프로그래밍/C ++

[C++] namespace

 

C언어

  • 동일한 이름의 함수는 2개 이상 만들 수 없다.
  • 함수의 이름을 변경해야 한다.

C++ 언어

  • namespace 문법을 사용하면 관련된 코드(함수, 구조체, 전역 변수 등)을 묶어서 관리할 수 있다.
  • 서로 다른 이름 공간에서는 동일한 이름 사용할 수 있다.
#include <stdio.h>

namespace Audio{
    void init(){
        printf("Init Audio Module\n");
    }
}

namespace Video{
    void init(){
        printf("Init Video Module\n");
    }
}
int main(){
    //init(); 
    Audio::init();
    Video::init();
}
#include "Video.h"

// 방법 1. 권장
namespace Video{
	void init(){
    }
}

// 방법 2. 권장X (class와  헷갈릴 수 있음)
void Video::reset(){

}

 

✔ namespace 요소에 접근하는 방법

ⓐ qualified name(완전한 이름) 사용 : 권장 방식

Audio::init();

 

ⓑ using declaration(선언) 사용

- init 함수를 namespace이름인 Audio:: 없이 사용 가능

using Audio::init;
init(); //ok
reset(); //error

 

ⓒ using directive(지시어) 사용하는 방식

//Audio 안의 모든 함수를 Audio:: 없이 사용 가능
using namespace Audio;
init();
reset();

 

# global namespace

👉특정한 이름공간에 포함되지 않은 공간

init() 1. 열려있는 namespace 검색
2. global namespace 검색
::init() 1. global namespace 검색
2. global init()이 없는 경우 에러

 

using declaration을 함수 밖에서 사용한 경우.

  • using 선언 아래 있는 모든 함수에서 Audio:: 이름 없이 접근 가능
  • global namespace에 동일 이름의 함수가 있을 경우 compile error.
  • global namespace에 동일 이름의 함수가 없을 경우 init(), ::init() 모두 Audio::init() 호출
#include <stdio.h>

namespace Audio{
    void init(){
        printf("Init Audio Module\n");
    }
}

namespace Video{
    void init(){
        printf("Init Video Module\n");
    }
}

//void init() { printf("init global module\n"); }
using Audio::init;

int main(){
   
    Audio::init();
    Video::init();

    using Audio::init;
    ::init(); // global module
    init();  
}

 

반응형

'프로그래밍 > C ++' 카테고리의 다른 글

[C++] 함수  (0) 2024.12.03
[C++] 자료형 (묵시적형변환)  (0) 2024.12.03
[c++] C++ 변수의 특징  (0) 2024.07.08
[C++] iosteam 표준 입출력  (0) 2024.07.08
[c++] std namespace / header file  (0) 2024.07.04