6.2 User-defined namespaces and the scope resolution operator

주홍영·2022년 3월 12일
0

Learncpp.com

목록 보기
61/199

https://www.learncpp.com/cpp-tutorial/user-defined-namespaces-and-the-scope-resolution-operator/

forward declaration을 해주기만 하면 중복으로 정의가 되어있지 않은이상
컴파일에 문제가 생기지 않는다

이렇게 생각하자
정의를 모르는 함수지만 forward declartion이 되어 있으므로
아 어딘가 있겠지 하고 일단 컴파일 한다음에 링킹하는거 아닐가?

예상대로 forward declaration을 하고 definition을 안해주면
link에러가 발생한다

definition된 cpp파일은 나중에 모두함께 취합이 되므로
forward declaration이 되어있는 파일이 어디에 있는지 몰라도 된다
따라서 include로 사용하고 있는 파일을 포함시켜줄 필요가 없다

무튼 naming collision을 막기 위해 namespace가 고안되었다
namespace는 다음 예시와 같이 사용한다

foo.cpp

namespace foo // define a namespace named foo
{
    // This doSomething() belongs to namespace foo
    int doSomething(int x, int y)
    {
        return x + y;
    }
}

goo.cpp:

namespace goo // define a namespace named goo
{
    // This doSomething() belongs to namespace goo
    int doSomething(int x, int y)
    {
        return x - y;
    }
}

이렇게 하고 그냥 doSomething을 사용하면 link 에러가 난다
왜냐하면 더 이상 global namespace에 do something이 존재하지 않기 때문이다

#include <iostream>

namespace fooNamespace
{
	void doSomething(int, int)
	{
		std::cout << "foo" << std::endl;
	}
}

namespace gooNamespace
{
	void doSomething(int, int)
	{
		std::cout << "goo" << std::endl;
	}
}

void doSomething(int x, int y)
{
	std::cout << "global" << std::endl;
	return;
}

int main()
{
	doSomething(1, 1);

	return 0;
}

위의 코드는 컴파일에러 및 링킹에러가 발생하지 않고 정상적으로 실행된다
namespace를 바꿔주거나 생략하면 global namespace를 사용하는 것이므로
naming conflict가 발생하지 않는다

주의

namespace는 일전에 forward declaration하고 cpp 파일에 정의만 해서
인식을 못한다
반드시 #include를 통해 namespace가 있는 파일을 추가 시켜주던지 해서
사용해야 한다
ex) std::cout 사용할 때도 iostream 추가하니까

profile
청룡동거주민

0개의 댓글