void func() {
int i= 1; //(2)
{
int i= 2; //(1)
// static int i= 2; // .DATA 초기화 안하면 .BSS
printf("%d", i); // 1? 2? 2가 나오죠.
// i를 어떻게 찾나? 이를 linkage라고 한대요. 컴파일러의 linker가 아니라네?
}
printf("%d", i);
}
linkage 규칙
자기가 속한 블럭에서 먼저 찾고
없으면 범위를 늘린다.
(1)을 주석처리하면 2가 출력
(2)를 주석처리하면 1이 출력되는게 아니라 에러, 왜냐면 {}사이에서 사라짐
(1)을 정적 변수로 만들면, 얘기가 달라짐, 그래도 에러, 왜요? scope에 접근이 안되기 때문
C:\\workspace\\work>size a.exe // 오호 이런 명령어가 있었어
text data bss dec hex filename
581520 91620 5888 679028 a5c74 a.exe
c:>objdump -h a.exe
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000709b8 0000000000401000 0000000000401000 00000600 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA
1 .data 000150f0 0000000000472000 0000000000472000 00071000 2**6
CONTENTS, ALLOC, LOAD, DATA
2 .rdata 0000c200 0000000000488000 0000000000488000 00086200 2**6
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .pdata 0000744c 0000000000495000 0000000000495000 00092400 2**2