f()와 f(void)의 차이점과 활용

컴퓨터 이야기/C++ 2010. 5. 25. 03:46

이 글은 'C' 에서 입니다. 'C++' 에선 이 문법은 불법입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
void foo1()
{
}

void foo2(void)
{
}

int main()
{
    foo1();
    foo2();
    return 0;
}


와 같은 코드는 될까요? 당연히 됩니다. 그렇다면
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
void foo1()
{
}

void foo2(void)
{
}

int main()
{
    foo1(1, 2);
    foo2();
    return 0;
}


는 어떨까요? 안될거 같죠? 됩니다. 되니까 글을 썼겠죠. -_-; 근데 이게 된다는건 어딘가에 쓸일이 있는거겠죠. 디버깅 해봅시다. 이제부터 foo2 함수는 더 이상 말하지 않겠습니다. 우리의 초점은 foo1 에 맞춰야 하니까요.
	foo1(1, 2);
0041726E  push        2    
00417270  push        1    
00417272  call        @ILT+2045(_foo1) (411802h) 
00417277  add         esp,8 
으흐흐 역시 우리의 컴파일러는 1 과 2 를 인자로 넣고 있군요! 
일단 간단하게 이걸 이용하는 예제로 int d = foo1(a, b); 를 하면
d = a+b; 를 수행하는 함수를 만들겁니다.

어쨌거나 아래와 같은 코드로
 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
__declspec(naked) int foo1()
{
    __asm
    {
        push ebp; // ebp 보존을 위한 백업준비 #1


        mov ebp, esp; // ebp 에 esp 를 받아둠.


        sub esp, 0cch; // 내부에서 또 스택을 쓸 수도 있으므로 공간마련 -_-;


    }
    __asm
    {
        mov eax, dword ptr[ebp+8];
        add eax, dword ptr[ebp+0ch];
    }
    __asm
    {
        mov esp,ebp; // sub 로 뺐던 esp 를 다시 원래대로 복원


        pop ebp; // #1


        ret;
    }
}

int main()
{
    printf("%d\n", foo1(1, 2));
    return 0;
}



2005년 어느날 작성

'컴퓨터 이야기 > C++' 카테고리의 다른 글

파일 다이얼로그  (0) 2010.07.17
Self documenting 합시다!!  (1) 2010.07.17
TR1 간단하지만 긴 소개  (0) 2010.05.25
헤더 파일은 적당히 나눠야 한다  (0) 2010.05.25
전 처리기 pragma 키워드  (0) 2010.05.25
: