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 |