ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • C
  • C++
  • 함수
  • SQL
  • 문자열
  • 포인터
  • 유니티
  • 백준
  • 그래픽스
  • 오블완
  • string
  • Unity
  • 티스토리챌린지
  • 클래스
  • c#
  • 파이썬
  • 프로그래머스
  • 배열
  • 알고리즘
  • 언리얼

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

C++ namespace와 using
프로그래밍 언어/C++

C++ namespace와 using

2022. 7. 5. 14:17

공동 작업 하다보면 네임스페이스로 나눠야 할 경우가 많다.

 

namespace 네임스페이스

네임스페이스는 내부 식별자(형식, 함수, 변수 등의 이름)에 범위를 제공하는 선언적 영역이다. 네임스페이스는 코드를 논리 그룹으로 구성하고 특히 코드베이스에 여러 라이브러리가 포함된 경우 발생할 수 있는 이름 충돌을 방지하는 데 사용된다. 네임스페이스 범위에 있는 모든 식별자는 한정 없이 서로에게 표시된다. 네임스페이스 외부의 식별자는 각 식별자에 대해 정규화된 이름을 사용하거나, std::vector<std::string> vec;단일 식별자에 대한 using Declaration(또는 네임스페이스using namespace std;(using std::string)의 모든 식별자에 대한 using 지시문을 사용하여 멤버에 액세스할 수 있다. 헤더 파일의 코드는 항상 정규화된 네임스페이스 이름을 사용해야 한다.

using

네임스페이스 이름 없이 a namespace 의 모든 이름을 명시적 한정자로 사용할 수 있다. 네임스페이스에서 여러 식별자를 사용하는 경우 구현 파일(예: *.cpp)에서 using 지시문을 사용한다. 하나 또는 두 개의 식별자만 사용하는 경우 네임스페이스의 모든 식별자가 아닌 범위로 식별자만 가져오는 using 선언을 고려한다. 지역 변수의 이름이 네임스페이스 변수와 동일한 경우 네임스페이스 변수가 숨겨진다. 전역 변수와 동일한 이름을 가진 네임스페이스 변수를 사용하면 오류가 발생한다.

 

아래 코드는 이번에 쓸 네임스페이스 Global.h 파일

#pragma once

namespace CustomEngine
{
    namespace PC
    {
        class Physics;
        class Render;
        class Audio;
    }

    namespace User
    {
        class Player;
        class IOSettings;
    }

    namespace Car
    {
        class Physics;
    }
}

namespace PC   = CustomEngine::PC;
namespace User = CustomEngine::User;

// PC 네임스페이스 클래스
using Physics = PC::Physics;
using Render  = PC::Render;
using Audio   = PC::Audio;

// User 네임스페이스 클래스
using Player     = User::Player;
using IOSettings = User::IOSettings;

// Car 네임스페이스 클래스
using Car = CustomEngine::Car::Physics;

렌더링 강체 클래스

namespace CustomEngine
{
    namespace PC
    {
        class Physics
        {
        public:
            std::string Test()
            {
                return "이것은 렌더링 강체 클래스\n";
            }
        };
    }
}

자동차 강체 클래스

namespace CustomEngine
{
    namespace Car
    {
        class Physics
        {
        public:
            std::string Test()
            {
                return "이것은 자동차 강체 클래스\n";
            }
        };
    }
}

여기서 치트키가 존재한다, Global 헤더파일 내에 선언한 using 닉네임으로 더더욱 짧게 하기. EX. Render == CustomEngine::PC::Render

#include "Render.h"
#include "Global.h"

//void CustomEngine::PC::Render::Present()
//{
//
//}

void Render::Present()
{

}

아래는 MainEngine.h

#pragma once
#include "Physics.h"
#include "Render.h"
#include "Audio.h"
#include "Player.h"
#include "IOSettings.h"

class MainEngine
{
public:
    void Init();

    void InitPhysics();

    void InitRender();

    void InitAudio();

    void InitPlayer();
};

아래는 MainEngine.cpp

#include <iostream>
#include "MainEngine.h"
#include "Global.h"
#include "CarPhysics.h"
#include "Physics.h"

using namespace std;

int main()
{
    Physics    physics;
    CarPhysics carPhysics;
    cout << physics.Test();
    cout << carPhysics.Test();
    return 0;
}

void MainEngine::Init()
{

}

void MainEngine::InitPhysics()
{
}

void MainEngine::InitRender()
{
}

void MainEngine::InitAudio()
{
}

void MainEngine::InitPlayer()
{
}

결과

익명 네임스페이스

#include <iostream>
#include "Global.h"
using namespace std;

namespace
{
    void Test()
    {
        cout << "이것은 전역 네임스페이스 테스트 함수" << endl;
    }
}

namespace A
{
    void Test()
    {
        cout << "이것은 A 네임스페이스 테스트 함수" << endl;
    }
}

int main()
{
    Test();
    A::Test();
    return 0;
}

 

출처 : me and Microsoft

https://docs.microsoft.com/ko-kr/cpp/cpp/namespaces-cpp?view=msvc-170

저작자표시 (새창열림)

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

C/C++ 연산자(Operator) 정리표 (비트, 논리, 산술 +=&^<<>>%~!)  (0) 2022.07.10
C++ POD, 표준 레이아웃 타입, 간단한 타입  (0) 2022.07.08
C/C++ 전처리기의 모든 것 (예외, 매크로, 토큰)  (0) 2022.07.04
C++ 연산자 오버로딩  (0) 2022.07.02
RAII (Resource Acquisition Is Initialization)  (0) 2022.06.29
    '프로그래밍 언어/C++' 카테고리의 다른 글
    • C/C++ 연산자(Operator) 정리표 (비트, 논리, 산술 +=&^<<>>%~!)
    • C++ POD, 표준 레이아웃 타입, 간단한 타입
    • C/C++ 전처리기의 모든 것 (예외, 매크로, 토큰)
    • C++ 연산자 오버로딩
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바