일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- OS 커널
- TiDB
- 약어
- Pointer
- kernel
- UNIX
- getopts
- newSQL
- 긴옵션
- Symbol
- 함수포인터
- DBMS
- 구조와 원리
- 포인터변수
- 전처리기
- go
- Windows via c/c++
- Golang
- 한빛미디어
- SQLite
- FreeBSD
- bash
- DBMS 개발
- TiKV
- 컴퓨터 강좌
- Preprocessor
- 포인터
- Programming
- 커널
- UNIX Internals
- Today
- Total
목록개발자 이야기/C/C++ (8)
sonumb
아래 코드를 보시죠. #include #include void foo(); /* void 매개변수?? */ int main ( void ) { foo(3,4); return 0; } void foo(a,b) /* K&R 스타일.. */ int a; int b; { printf("%d %d\n", a,b); return; } 함수선언에 매개변수로 아무것도 넣지 않았습니다만, 함수 정의부에서는 인자를 넣고, 파일을 저장하고 컴파일하면 잘됩니다. 심지어 실행도 잘됩니다! -_- 이는 논란의 소지가 될 수 있겠군요. 결론: 따라서 함수선언 시, void를 명시적으로 해야합니다.
작성자 : sonumb (http://sonumb.tistory.com) E-mail: 작성일 : 2008년 2월 19일 Contents 0. 서론 1. 컴파일러 세팅 2. 소스파일 3. 빌드 결과 4. 결론 5. 관련링크 & 참고서적 0. 서론 [contents] 목적: 함수 호출 시 메모리 변화(구성되는 Stack Frame)와 메모리 해제에 대한 설명. 용어 : Stack Frame : 함수 호출시 구성되는 스택의 형태 , 보통 실인수(argument value), 리턴 주소, 지역변수로 구성됩니다. 1. 컴파일러 세팅 [contents] Release 모드로 맞춰놓고 C/C++의 Optimization 기능을 Disabled. C/C++의 Output Files의 Assembler output을 ..
목차. 1.File Inclusion 2.Macro Substitution 3.Contitional Inclusion 4.기타 Preprocessor의 핵심: `Preprocessing`은 링크전도 아닌 컴파일타임도 아닌 컴파일타임 전에 일어난다는 것이다. 1.File Inclusion 제목을 영어로 거창하게 적어놨지만 역시 핵심은 파일을 갖다 붙이겠다는 말이다. #include or #include "filename" 로 묶여진 파일은 implementation-defined rule에 의해 해당파일을 찾는다. ","로 묶여진 파일은 보통 해당파일(즉 #include "filename"이 쓰여진 파일)이 있는 폴더내에서 찾는다. 2.Macro Substitution #define #define 은 이래..
이번 포인터는 보너스이다. 쪼금은 난해하다. 따라올려면 와도괜찮다. 함수 포인터를 인자로 받고 함수 포인터를 반환하는 함수: p 아 이게 무슨 마른 운영체제에 세그먼트폴트같은 소리인가. 예를 보자. void (*signal(int signo, void (*func)(int) ))( int );위의 함수는 유닉스의 시그널 함수라는 것이다. 시그널함수는 일종의 콜백함수이다..즉 어떤일을 동적으로 처리해달라는 거다. 설명은 그정도로만 하고 , 위의 함수는 조금 `거시기`하다. 일반적으로 return funtion_name( parameter ); 의 문법과는 도통 매치가 되지 않는다. 왜냐하면... 그렇게 만들었기 때문이다. 문법을 만든 Geeks 두분의 생각일 뿐이다.-_-; 하지만!!! 알아보기 좋도록 간..
저번시간에 이어 두번째로 이번에는 함수 포인터를 설명하겠다. 일단 들어가기 전에 두가지 정도 알려줄려고 한다. 첫째 함수 포인터는 어따 써먹는가/ 뭐 용도가 있었으니 커니건,리치옹께서 만들지 않았겠나? (퍽퍽~) 각성하고... 보통, `포인터`가 들어가면 `Dynamic`이란 말과 꽤나 연관이 있어진다. compile-time이 아닌 run-time에 결정을 해야한다는 소리인데.. 그러면 함수랑 연관 시켜 뜻풀이를 시도해보자.. 함수,즉 어떻게 해야할 일이 run-time에 서로 달라져야 한다. 그러면 보통 운영체제랑 연관시켜 보자. Task Switching이 대표적이 예라 할 수 있겠다. ( 솔직히 커널이나 시스템 프로그래밍아니면 응용한 곳이 거의 없다. -_-;). 생각해보자. 커널이라는 프로그램은..
요즘 시중에 나와있는 포인터 책들을 자세히는 보지 못했으나 책 두께가 그렇게 된다는 것은 조금 오버이지 않나 생각이 든다. 너무 어렵게 생각하는 경향이 있는 거 같다. :p 크게 나눠서 일반적인 변수에 대한 포인터, 함수에 대한 포인터 정도로 나눠본다. 첫째로 일반적인 변수에 대한 포인터에 대한 개념은 아주 단순하다. 대상의 주소와 포인터 연산시 메모리 번지수를 얼마 만큼 더해야하는가에 대한 표기.더이상 어려울것도 없다. :-) 아래 예제를 보자. #include int main( void ) { int arr[20][30][40]; int (*p)[30][40]; int i,j,k; ; 배열 인덱스 long x=0; ; 값대입. for( i=0; i
#define FOO1 #ifdef FOO1 # define MONTH 1 # define DAY 1 #elif FOO2 # define MONTH 2 # define DAY 6 #endif #include int main ( void ) { printf("%d월 %d일 \n" , MONTH, DAY ) ; return 0; } 위의 Preprocessor를 잘 보기 바란다. 여기서 사소한 퀴즈 두개. 위에서 #elif FOO2 는 과연 문법에 맞는 것 일까? 틀렸다 . #elif defined( FOO2 ) 이나 #else ifdef FOO2 로 해야된다. 사실 #elif FOO2 는 문법에 틀렸으나 컴파일이 잘된다. 무슨 일이 벌어졌나? 이전에 #define FOO2 가 0이 아닌 값을 가진다면 컴파..