Pure Software Engineer :)
[C] namespace 본문
C++카테고리 이지만 C내용도 끼어서 써보자.
회사에서 C++ 를 사용해서 개발을 하고 있다.
그런데 구조체를 사용하는데 있어서 다음과 같은 형태로 사용하고 있었다.
1
2
3
4
5
6
7
8
9
10
11
12
|
struct Samle {
int a;
int b;
};
int main () {
Sample s1;
...
return 0;
}
|
아무생각도 없이 이런식으로 쓰고 있었는데, 문득 C언어에서는 typedef을 하지 않으면 아래와 같이 struct 키워드를 붙여서 사용해야만 했다는것이 기억이 났다.
1
2
3
4
5
6
7
8
9
10
11
12
|
struct Samle {
int a;
int b;
};
int main () {
struct Sample s1;
...
return 0;
}
|
찾아본 결과 C와 달리, C++에서는 모든 struct/union/enum/class 선언은 암묵적으로(implicitly) typedef 한 것처럼 동작한다는 것이었다.
회사에서 개발한지 1년이 다되어 가는데 이제서야 문득 이게 궁금해지다니...참ㅠㅠ
찾다가 보니 c namespace에 대해서도 조금 알게 되었다.
C에는 identifier에 대한 총 4가지의 namespace 를 가지고 있으며 이들은 다음과 같다.
1. Label (goto 에서 사용하는)
2. Tags (structure, union, enumeration 이름)
3. structure, unions의 멤버
4. all other identifiers (함수이름, 변수이름, type(def) 이름, enumeration 상수)
따라서, 위 1~4번에서 다른 namespace에 속한다면 이름이 같아도 conflict가 발생하지 않는다.
예를들어, sample이라는 이름으로 구조체(2번)와 함수(4번)을 사용한다고 해도 둘다 충돌 하지않는다.
하지만, 당연하겠지만 같은 이름으로 사용하면 프로그램 가독성은 떨어질 것이다.
References
http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c
http://stackoverflow.com/questions/3793952/understanding-c-namespaces
'Software Engineering > Programming' 카테고리의 다른 글
[C++] bool vs. enum (0) | 2014.08.11 |
---|---|
[Refactoring] What is refactoring? (0) | 2014.05.17 |
[항목5] C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2014.01.07 |
[C, C++] Compile time assertion (0) | 2013.12.12 |
[항목49] new 처리자의 동작 원리를 제대로 이해하자 (0) | 2013.07.20 |