* strcpy 등의 길이제한이 없는 함수는 사용하지 않는다 -> strncpy, memcpy와 같은 함수를 사용하고, 스트링 맨 끝에, 0을 넣어주는 것이 안전하다. 특히나 클라이언트에서 올라온 데이터는 더더욱 그렇다. * 포인터 검사는 반드시 하라 -> 포인터 사용시에는 무조건 NULL포인터 검사를 하는 것이 좋다. 바로 쓰고 싶을 경우는 참조자를 사용해서 항상 유효한 데이터임을 알린다. * 서식 지정자에 넣는 값에 유의하라. -> 스트링 안에 %s %d 라는 코드가 있고, 가변 인자가 주어지지 않으면 에러가 발생한다. %s 로 문자열을 입력 받으려 하는데, float형이나, int형을 입력했을 때에도 C는 널을 만나기 전까지 데이터 읽는 것을 멈추지 않는다. 잘못된 메모리를 접근 문제는 언제나 조심..
가상키 코드 값 키 VK_LBUTTON 01 VK_RBUTTON 02 VK_CANCEL 03 Ctrl-Break VK_MBUTTON 04 VK_BACK 08 Backspace VK_TAB 09 Tab VK_CLEAR 0C NumLock이 꺼져 있을 때의 5 VK_RETURN 0D Enter VK_SHIFT 10 Shift VK_CONTROL 11 Ctrl VK_MENU 12 Alt VK_PAUSE 13 Pause VK_CAPITAL 14 Caps Lock VK_ESCAPE 1B Esc VK_SPACE 20 스페이스 VK_PRIOR 21 PgUp VK_NEXT 22 PgDn VK_END 23 End VK_HOME 24 Home VK_LEFT 25 왼측 커서 이동키 VK_UP 26 위쪽 커서 이동키 VK_R..
첫째, 성능 문제, 지적하신 분들의 공통된 주장이 바로 bool은 BOOL에 비해 윈도우와 같은 32bit 환경에서 느리기 때문에 사용하지 않는다는 것입니다. bool이 BOOL보다 느리다죠. 맞습니다. 레지스터나 I/O 처리 등이 32bit 즉, 4bytes데이터에 최적화 되어 있기 때문에 char, unsigned char등과 같이 1byte 자료형은 4bytes size의 자료형에 비해 내부적으로 추가적인 처리가 필요합니다. 그런데 bool은 대개의 컴파일러에서 1byte로 처리를 하며 VC++에서도 int는 4bytes, bool은 1byte의 size를 가집니다. 따라서 bool은 BOOL(=int)에 비해 느립니다. 그러나 이러한 성능을 운운하는 것은 소위 말하는 '이른 최적화'라고 지적하고 ..
TCHAR to the rescue! TCHAR가 구원의 손길을 내밀다! TCHAR is a character type that lets you use the same codebase for both MBCS and Unicode builds, without putting messy #defines all over your code. A definition of the TCHAR looks like this: TCHAR는 MBCS와 유니코드 빌드 모두의 경우에 같은 기초코드를 사용할 수 있도록 해주는 문자 타입이다. 여러분의 코드에 너저분한 #define 문들을 넣이 않고도 말이다. TCHAR의 정의는 다음과 같다. #ifdef UNICODE typedef wchar_t TCHAR; #else typed..
Preface 프로그래밍을 하다 보면 static만큼 다양한 곳에서 다양한 의미로 많이 쓰이는 키워드가 없는 것 같습니다. C/C++과 같은 정적인 언어 뿐만 아니라 JAVA와 같이 동적 바인딩을 기본으로 하는 언어에서조차 static이 사용되는 것을 보면 옛 속담처럼 '귀에 걸면 귀걸이, 코에 걸면 코걸이'가 되는 것이 static이라는 키워드인 것 같습니다. 그러나 유감스럽게도 이렇게 자주 쓰이고 중요하게 사용되는 static을 잘못 이해하고 있거나 많은 특징들을 모르고 있는 사람들이 의외로 많습니다. 특히 시중에 판매되는 대다수의 프로그래밍 입문 서적들이 static에 대해서 정확하고 자세하게 설명하고 있지 않다라는 사실이 이렇게 부족하게 나마 static에 대한 글을 쓰게 된 이유라 할 수 있습니..
class Base { public: void Init(){printf("Base");} }; class Inheritance : public Base { public: void Init(int a) { printf("Inheritance %d", a); } };int main(int argc, char **arv) { Inheritance inheritance; inheritance.Init(); return 0; } 위 코드는 컴파일 에러를 발생시킨다. 내가 이 코드를 작성한 의도는 함수 오버로딩이다. 즉, 같은 이름의 함수가 여러 개가 있고, 파라미터가 다르다면 다른 함수로 인식할거라고 생각한 것이다. 그런데, 같은 이름의 함수가 있을 경우, 자식 클래스의 함수만 유효하다. int main(int ..
char* GetStr() { static char szStr[] = "Hello"; return szStr; } void PrintStr(char **str) { printf("%s",*str); } int main(int argc, char **arv) { PrintStr(&GetStr()); return 0; } 위 코드는 아래와 같은 컴파일 에러를 발생시킨다. error C2102: '&' requires l-value 컴파일러의 에러는, l-value. 즉, 어딘가에 저장된 값에만 주소 연산자를 사용할 수 있다는 말이다. 내가 이 코드를 작성한 의도는 char형 포인터의 포인터 (이중 포인터)를 매개 변수로 받는 PrintStr함수의 매개변수로, char형 포인터를 반환하는 GetStr함수의 반..
C 프로그래머가 알아야 할 것들 - Chapter 7 어셈블리 김성훈 (sunghun84@nate.com) (1) 어셈블리 언어 C언어는 다른 언어들 보다 어셈블리에 근접한 언어입니다. 인라인 어셈블리가 가능한 데다가, 메모리를 직접 다루는 것이 가능하며, C언어는 어셈블리어와 1:1대응까진 아니지만 대응 되는 언어이기 때문입니다. C언어로 작성한 코드는 컴파일러를 통해서 어셈블리어와 대응되는 오브젝트 파일로 반드시 변환이 되어야 해당 코드가 실행 될 수 있습니다. 어셈블리 언어는 그 코드가 어떤 일을 할지를 추상적이 아니라, 직접적으로 보여줍니다. 논리상의 오류나, 수행 속도, 수행 과정에 대해 명확히 해준다는 점에서 직관적인 언어입니다. 어셈블리 언어를 사용하면 메모리에 대한 이해도도 높아집니다. 우..
- Total
- Today
- Yesterday
- Rails
- 임백준
- c언어
- 디자인 패턴
- svn
- TraceRoute
- 루비 온 레일즈
- 바로가기 프로그램
- 리버스 엔지니어링
- Ruby on Rails
- 엘키
- SDL
- perfmon
- RoR
- SQLite Spy
- CppSQLite
- ruby
- ftp
- 게임개발포에버
- EzShortcut
- 게임데브포에버
- TDD
- MS-SQL
- NDC2013
- EasyExec
- 멀티스레드
- 루비
- 디버깅
- 조엘 온 소프트웨어
- 좋은 프로그래머
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |