Languages & Frameworks/C C++
[C] 타입 Types / Type Casting / 가변 인자
[C] 타입 Types / Type Casting / 가변 인자
2017.09.04``c ``를 사용하도록 하자.``c int``보다 ``c uint8_t`` 같은 고정 크기 타입을 사용하는 것이 좋다.``c char``보다 ``c TCHAR``를 사용하는 것이 좋다. 윈도우인 경우 컴파일 옵션에 따라 리눅스 등에서도 호환 가능하기 때문. Types```cuintptr_t```포인터를 대상으로 덧셈, XOR 등 수치 연산이 필요한 경우 포인터를 숫자값으로 취급하기 위해 사용하는 타입.어떤 포인터라도 담을 수 있는 크기의 데이터 타입이라는 의미가 된다.따라서 포인터를 대상으로 수치 연산이 필요한 경우 사용한다.``cpp (uintptr_t)this + 4`` 이렇게 더하기 연산을 해도 1씩 증가하기 때문에, `` uint8_t*``같은 것으로 변환하는 것 보다 더 낫다. `` uint8..
[C/C++] define, inline, const, enum, enum class
[C/C++] define, inline, const, enum, enum class
2017.09.04#define의 쓰임``c #define``은 옵션이나 flag를 지정할 때만 사용하고, 다른 용도일 경우 ``c inline``이나 ``c static const``를 사용하는 편이 좋다.이렇게 할 경우 1. type-safe하고, 2. 어디에 쓰느냐에 따라 scope도 지정 가능하며, 3. 디버깅 심볼이 생성되어 디버깅이 편하다는 장점이 있다. 간단한 함수 차원의 #define / inlineC에서 사칙연산 같은 간단한 작업은 ``c #define macro``를 활용해 왔으나, 요즘은 C에서도 inline이 가능하므로 이 쪽을 권장한다.```cextern inline void f() { }``` C++에서도 ``c #define``은 꼭 필요한거 아니면 쓰지 않는 것을 권장한다. (Google C+..
[C] the end of the address space check
[C] the end of the address space check
2017.07.27```cif (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)```* `` size`` is `` p``'s size ``c type(x) = uintptr_t``일 때, ``c x + ~x = uintptr_t's MAX (111...11)`` 이므로``c p + x = MAX`` 이면 ``c p = ~x``다. ``c -x = ~x + 1``이므로 ``c p = -x - 1``이다.* 이를 대입하면 ``c x -x -1 = MAX``가 나오는데, 보통 ``c int(-1) = uintptr_t's MAX (111....11)``임을 생각해보면 된다. 따라서 ``c p = -x -1``이면 ``c p + x = uintptr_t's MAX``다.``c..
malloc/calloc tip, wrapper
malloc/calloc tip, wrapper
2017.07.12calloc```cvoid *calloc(size_t nmemb, size_t size);```결과적으로 할당되는 크기는 ``c nmemb * size`` bytes다. 어차피 0으로 초기화 할거면, ``c malloc() + memset()`` 보다 ``c calloc()``을 사용하는게 더 빠르다. kernel이 memory를 제공하기 전에 zero로 만들고 제공할 수 있기 때문. malloc wrapper```c/* like malloc(), but terminates on failure */void * xmalloc(size_t size){ void *p; p = malloc(size); if (!p) { perror("xmalloc"); exit(EXIT_FAILURE); } return p;}..
[C++] Namespace 네임스페이스
[C++] Namespace 네임스페이스
2017.06.15여러 명이 함께 개발에 참여할 때, UML을 작성하는 등 체계적으로 접근해서 시작부터 프로젝트를 잘 모듈화해서 구성한다면함수나 변수, 클래스 이름이 충돌 날 가능성이 적지만 보통 일단 시작부터 하고 보기 때문에 이름이 충돌하는 경우가 있다. 네임스페이스는 이름을 묶어주는 그룹이라고 생각하면 된다.user1과 user2가 모두 `` funcA``를 정의했을 때, 각각이 다른 namespace에 속한다면 namespace를 명시하는 것으로 둘을 구분할 수 있기 때문에 그대로 `` funcA``를 사용할 수 있는 것이다. naming convention```cppCompanyName.TechnologyName[.Feature][.Design]```대소문자도 위처럼 쓰면 된다. c++에서의 namespace``..
exec 계열 함수
exec 계열 함수
2017.05.01```c#include int execl(const char *path, const char *arg1, arg2, ..., NULL); int execlp(const char *file, const char *arg, arg2, ..., NULL); int execle(const char *path, const char *arg, arg2, ..., char * const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execve(const char *file, char *const argv[], char *const envp[]);```모든 exec..
fork - exec / wait +clone
fork - exec / wait +clone
2017.05.01fork```c#include pid_t fork(void);```fdchild는 parent의 file table을 복사해가기 때문에``c fork()``나 ``c exec()``나 `` fd``는 유지된다.* thread는 main thread의 context를 공유하기 때문에, thread도 마찬가지다. exec2017/03/08 - [System/etc] - exec 계열 함수 wait (man wait)All of these system calls are used to wait for state changes in a child of the calling process, and obtain information about the child whose state has changed. A stat..
Assembly
Assembly
2016.11.18Intel x86 Architecture ( windows ) 연산 방향 ←AT&T Architecture ( *-NIX계열 ) 연산 방향 → ( * gdb가 아니라 objdump에서 확인해야 함 ) Inline Assembly```cint input = 3;int output = 0;__asm__ __volatile__( "mov %1, %%eax \n\t" "add $1, %%eax \n\t" "mov %%eax, %0 \n\t" : "=r" (output) : "r" (input) : "eax"); // clobber```output / input / clobber를 사용하는 경우(Extended asm), asm에서 레지스터를 사용할 때 반드시 ``c %%``로 적어주어야 한다. 반대로 Basic..
[C] printf, scanf계열
[C] printf, scanf계열
2016.11.10```c%p == %#x%2x 2자리 출력. 빈칸일 경우 공백으로 채움%02x 2자리 출력. 빈칸일 경우 0으로 채움%u unsigned type 출력. 기본은 int%h short 출력. h 한 개 붙일 때 마다 1/2씩 감소.%hhu uint8_t 출력%hhx uint8_t 16진수 출력``` ``c scanf()`` 쓸 때 마지막 개행문자가 버퍼에 남지 않을 수 있도록 format string 끝에 ``c \n``을 적어주는 것이 좋다.표준 함수에서 BOF를 예방하는 법은 ``c %100s`` 같이 사용하는 것. ( 입력을 100개의 char로 제한. )``c scanf()``는 다양한 형식을 입력받아야 할 때 사용하고, 단순히 문자열을 입력 받는 함수가 필요하다면 ``c fget()``를 사용하는..
[C] atoi / strtol , sprintf : 문자열 > 숫자, 16진수 변환
[C] atoi / strtol , sprintf : 문자열 > 숫자, 16진수 변환
2016.11.06문자열 > 숫자```c#include int atoi(const char *nptr);long atol(const char *nptr);long long atoll(const char *nptr); long int strtol(const char *nptr, char **endptr, int base); // strtollunsigned long int strtoul(const char *nptr, char **endptr, int base); //strtoull``` 직접 변환하기```cpp auto i = 0; while (isdigit(input[pos])) i = i * 10 + input[pos++] - '0';``` 숫자 > 문자열```c#include int printf(const char ..
Pointer
Pointer
2016.09.14추적 주소 값 1284EA43 71 (**a) 125F7458 1284EA43 (*a) 122EF560 (&a) 125F7458 (a) ②→ ①↖ 포인터는 1 2 순서로 이동하며 따라가면 편하다. 포인터는 주소, 0차, 1차, 2차, ...로 생각하면 편하다. 주소 0차 1차 2차 &a a *a **a 122EF560 125F7458 1284EA43 71 포인터를 지원한다는 것은 어떤 변수에 대해 ``c &``연산을 통해 변수의 주소를 구할 수 있음을 의미한다. 자바도 참조개념을 사용하지만 포인터를 지원하지 않는다고 하는 것은 이런 맥락에서다. 포인터 배열과 배열 포인터 ```c int *p[4]; // 포인터 배열. [주소, 주소, 주소, 주소] int (*p)[4]; // 배열 포인터. [크기 4인 ..