여러 가지 식별자(개발자가 이름지어줄 수 있는 것)들을 이름이 있는 범위로 그룹화하는 기법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/* a.h */
namespace a {
extern int number; // extern 변수 선언
void print(); // extern 함수 선언
}
/* b.h */
namespace b {
extern int number; // extern 변수 선언
void print(); // extern 함수 선언
}
/* a.cpp */
#include <iostream>
using namespace std;
namespace a {
int number = 3; // extern 변수 정의
void print() { // extern 함수 정의
cout << "a print() number = " << number << endl;
}
}
/* b.cpp */
#include <iostream>
using namespace std;
namespace b {
int number = 7; // extern 변수 정의
void print() { // extern 함수 정의
cout << "b print() number = " << number << endl;
}
}
/* main.cpp */
#include <iostream>
#include "a.h"
#include "b.h"
using namespace std;
int main(void) {
cout << "main()에서 출력하는 a 네임스페이스의 number = " << a::number << endl;
a::print();
cout << "main()에서 출력하는 b 네임스페이스의 number = " << b::number << endl;
b::print();
return 0;
}
|
cs |
▶ 정리
- extern이 있는 초기화 구문 : 변수를 새로 정의하라는 의미 (메모리 할당해서 변수 정의)
- extern이 있고 초기화 없는 구문 : 다른 파일에 해당 이름의 변수가 있으면 가져다 쓰라는 의미. 없으면 0 초기화 )메모리 할당)
- 블록 외부에서 extern이 없는 초기화 구문 : 변수를 새로 정의 (메모리 할당)
- 블록 외부에서 extern이 없고 초기화도 없는 구문 : 변수를 새로 정의하고 0 초기화 (메모리 할당)
- 새롭게 변수를 메모리에 할당할 때 같은 이름의 extern 변수가 있는 경우 에러발생.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
/* a.h */
namespace a {
extern int number;
int fuc();
}
/* b.h */
namespace b {
extern int number;
namespace inner {
extern int number;
int func();
}
/* a.cpp */
#include <iostream>
using namespace std;
namespace a {
int number = 7;
int func() {
return number;
}
}
/* b.cpp */
#include <iostream>
using namespace std;
namespace b {
int number = 5;
namespace inner {
int number = 3;
int func() {
return number;
}
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <iostream>
using std::cout;
using std::endl;
namespace { // 해당 파일에서만 접근가능
int number = 10; // extern 변수 정의부
void func() { // extern 함수 정의부
cout << "func" << endl;
}
}
int main(void) {
cout << number << endl;
func();
return 0;
}
|
cs |
Linker가 a.obj와 b.obj를 링크하는 과정에서 하나만 존재해야 할 함수 정의부가 2개 있는 것을 발견
→ 이중 정의로 인한 Link Error 발생
따라서, 헤더파일에는 선언부만 있는 것을 권장
(단, 하나의 파일만 사용할 경우는 상관 없음)
[TIL] 1 - 6. 객체지향 기본 문법 - 참조 (0) | 2022.02.09 |
---|---|
[TIL] 1 - 5. 객체지향 기본 문법 - const의 이해 (0) | 2022.02.08 |
[TIL] 1 - 4. 객체지향 기본 문법 - C++에서 확장된 함수의 기능 (0) | 2022.02.08 |
[TIL] 1 - 2. 객체지향 기본 문법 - C++에 추가된 데이터 타입 및 향상된 for문 (0) | 2022.02.07 |
[TIL] 1 - 1. 객체지향 기본 문법 - C++의 객체를 이용한 입출력 (0) | 2022.02.06 |
댓글 영역