๐ข chap12. ์ต์ C
โญ 12.1 C11
- C ์ธ์ด๋ ISO ํ์ค์ผ๋ก ํ์คํ ๋์์
- C ๋ฅผ ๊ฐ์ ํ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์ ํจ
- C99 < C11 (์ด์ ์ C99 ํ์ค ๊ฐ์ ) < C18 (C11 ๋์ฒด)
- C18์ ์๋ก์ด ๊ธฐ๋ฅ ์ ๊ณต X, C11 ์์ ๋ฐ๊ฒฌ๋ ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฟ!
- ์๋ก์ด ๊ธฐ๋ฅ์ ๋์
ํ๋ ค๋ฉด ์ด์ ์ฝ๋๋ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ์ํ
- ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ฉด ์๋๊ณ , ๋ฒ๊ทธ๊ฐ ์์ด์ผ ํจ
- C11 ๋ง๋ค๊ธฐ ์ C ์ปค๋ฎค๋ํฐ ์ฌ๋๋ค์ ์ผ๋ คํ ๊ฑฑ์ ๊ณผ ์๊ฐ ์๋ฃ
- But, C11 ์ถ์๋์์ ๋ ์ด์์ ์ธ ํํ๊ฐ ์๋์์ผ๋ฉฐ ์ค์ ๋ก ์ฌ๊ฐํ ๊ฒฐํจ ์์์
- C18 ์ C11 ์์ ๋ฐ๊ฒฌ๋ ๊ฒฐํจ์ ๊ณ ์น๊ณ ์ ํจ (๋น๊ณต์์ ์ผ๋ก C17)
- ์ํผ, ํ์ค ์ ๋ฆฌํ๋ ๊ณผ์ ์ด ๊ต์ฅํ ์ด๋ ต๊ณ ๊น๋ค๋ก์ ๐ซ
โญ 12.2 C ํ์ค ์ง์ ๋ฒ์ ์ฐพ๊ธฐ
- C11 ํธํ ๊ฐ๋ฅํ ์ปดํ์ผ๋ฌ : gcc, clang ๊ฐ์ ์คํ ์์ค ์ปดํ์ผ
So, ํน์ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํด C ๋ฒ์ ์ ๊ฐ์งํ๊ณ , ๋ฒ์ ์ ๋ฐ๋ผ์ ์ง์๋๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ฒ ์์๋ณด์ โ
๋จผ์ ํ์ฌ ์ด๋ค ๋ฒ์ ์ ์ฌ์ฉํ๋์ง ํ์ธํ๊ธฐ
- ๋ฆฌ๋ ์ค์์๋ gcc, macOS ์์๋ clang ์ฌ์ฉ
- ํ์ฌ C ํ์ค ๋ฒ์ ์ ๊ฐ์งํ๊ธฐ ์ํด ๊ธฐ์กด์ ์ ์๋ ๋งคํฌ๋ก๋ฅผ ๋ฐํ์ ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋๊ฐ
C ํ์ค ๋ฒ์ ์ ๊ฐ์งํ๊ธฐ & ์ปดํ์ผ ํ๊ธฐ
- C ํ์ค์ ์ฌ๋ฌ ๋ฒ์ ๊ตฌ๋ณํ ์ ์์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include <stdio.h> int main(int argc, char** argv) { // ์ ์ผ ์ต์ #if __STDC_VERSION__ >= 201710L printf("Hello World from C18!\n"); #elif __STDC_VERSION__ >= 201112L printf("Hello World from C11!\n"); #elif __STDC_VERSION__ >= 199901L printf("Hello World from C99!\n"); // ์ ์ผ ์๋ #else printf("Hello World from C89/C90!\n"); #endif return 0; }
๋ค์ํ ๋ฒ์ ์ C ํ์ค์ผ๋ก ์ปดํ์ผํ๊ธฐ
- ์ปดํ์ผ๋ฌ๋ก -std=CXX ์ต์ ์ ์ ๋ฌํด์ผ ํจ
- ์ต์ ์ปดํ์ผ๋ฌ์ ๊ธฐ๋ณธ C ํ์ค ๋ฒ์ ์ C11 ์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
$ gcc ExtremeC_examples_chapter12_1.c -o ex12_1.out $ ./ex12_1.out Hello World from C11! $ gcc ExtremeC_examples_chapter12_1.c -o ex12_1.out -std=c11 $ ./ex12_1.out Hello World from C11! $ gcc ExtremeC_examples_chapter12_1.c -o ex12_1.out -std=c99 $ ./ex12_1.out Hello World from C99! $ gcc ExtremeC_examples_chapter12_1.c -o ex12_1.out -std=c90 $ ./ex12_1.out Hello World from C89/C90! $ gcc ExtremeC_examples_chapter12_1.c -o ex12_1.out -std=c89 $ ./ex12_1.out Hello World from C89/C90!
โญ 12.3 gets ํจ์์ ์ ๊ฑฐ
- ์ ๋ช
ํ gets ํจ์๊ฐ ์ ๊ฑฐ๋จ
- C11 ํ์ค์์ gets ์ฐ๋ฉด C11 ์ปดํ์ผ๋ฌ๋ก ์ปดํ์ผ ๋์ง ์์
- gets ํจ์
- ํค๋ณด๋๋ก๋ถํฐ ๋ฌธ์์ด์ ์
๋ ฅ๋ฐ์ ๋ฒํผ์ ์ ์ฅํ๋ ํจ์
- ์ด ํจ์๋ ํ๋์ ์ธ์๋ฅผ ์๊ตฌํ๋๋ฐ, ๊ทธ๊ฒ์ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ์ ์ฅํ ๋ฒํผ
- โ ๋ฒํผ๋
- buffer ๋ฐฐ์ด ๋ณ์์ ์์ ์ฃผ์
- C์ธ์ด์์ โ๋ฐฐ์ด์ ์ด๋ฆ์ ๊ทธ ๋ฐฐ์ด์ ์์ ์ฃผ์์ ๋์ผํ๋คโ
- gets() ํจ์์ ์ธ์๋ก ์ ๋ฌ๋๋ ๊ฒ์ โ๋ฉ๋ชจ๋ฆฌ ์ฃผ์โ ๊ฐ (buffer ๋ณ์์ ์์ ์ฃผ์)
- ์ํฐ๊ฐ ์
๋ ฅ ๋ ๋๊น์ง ์
๋ ฅ์ ๋ฐ์
- ์ฌ์ฉ์๊ฐ ์ํฐ๋ฅผ ์น๊ธฐ ์ ๊น์ง ์ ๋ ฅํ ๊ฐ๋ค์ ์ธ์๋ก ์ฃผ์ด์ง ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ์ฅํ๋คโ
- So,, ์ํฐ ์ ๋ ฅ ์ ๊น์ง ๋ง์ ๊ฐ ์ ๋ ฅ.. โ ์ฌ์ฉ์์ ๊ณผ๋ํ ์ ๋ ฅ์ด ๊ฒฐ๊ตญ ๐จ ๋ฒํผ ์ค๋ฒ ํ๋ก์ฐ๋ฅผ ๋ฐ์
- buffer ๋ฐฐ์ด ๋ณ์์ ์์ ์ฃผ์
- ๋ฒํผ ์ค๋ฒํ๋ก ๊ณต๊ฒฉ์ ๋์์ด ๋๋ค
- ๊ฒฝ๊ณ ๊ฒ์ฌ๊ฐ ์๊ณ ํธ์ถ ํ๋ก๊ทธ๋จ์ด ๋ค์์ ์ฌ ํ์ ๊ธธ์ด๋ฅผ ํ์คํ๊ฒ ๊ฒฐ์ ํ์ง ๋ชปํ๋ ๋งํผ, ์ด ํจ์๋ ์ ์ฑ ์ฌ์ฉ์๊ฐ ๋ฒํผ ์ค๋ฒํ๋ก ๊ณต๊ฒฉ์ ํตํด ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ฅ์ ์์๋ก ๋ณ๊ฒฝํ ์ ์์
- ํค๋ณด๋๋ก๋ถํฐ ๋ฌธ์์ด์ ์
๋ ฅ๋ฐ์ ๋ฒํผ์ ์ ์ฅํ๋ ํจ์
- ๋ฐ๋ฉด์ fgets ํจ์๋ ๊ฒฝ๊ณ ๊ฒ์ฌ ๋จ
- fgets ํจ์
- FILE ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์
์ถ๋ ฅ ์คํธ๋ฆผ์์ ๋ฌธ์์ด์ ๊ฐ์ ธ์ค๋ ํจ์
char*fgets(char* str,int numChars, FILE* stream); char*fgets(char* str,int numChars, stdin); // ํค๋ณด๋๋ก๋ ์ ๋ ฅ ๊ฐ๋ฅ
- ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์(str) : ํ์ผ์์ ์ฝ์ ๋ฌธ์์ด์ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ๋๊ฒจ์ฃผ๊ธฐ
- ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์(numChars) : ์ ์ฅํ ๋ฌธ์์ ์ต๋ ๊ฐ์๋ฅผ ์ง์
- ์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์(stream) : ํ์ผ์์ ๋ฌธ์์ด์ ์ฝ๊ธฐ ์ํด ์ฌ์ฉํ ํ์ผ ํฌ์ธํฐ
- FILE ๊ตฌ์กฐ์ฒด ์ฌ์ฉํ๋ฉฐ, ํ ์คํธ ํ์ผ ๊ด๋ฆฌํ๋ ํฌ์ธํฐ
- ๊ฒฐ๊ณผ๋ฅผย string์ ์ ์ฅํ๊ณ ์คํธ๋ง ๋์ ๋(null) ๋ฌธ์(\0)๋ฅผ ์ถ๊ฐ
- FILE ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์
์ถ๋ ฅ ์คํธ๋ฆผ์์ ๋ฌธ์์ด์ ๊ฐ์ ธ์ค๋ ํจ์
- fgets ํจ์
โญ 12.4 fopen ํจ์๋ก์ ๋ณํ
fopen ํจ์
- ํ์ผ์ ์ด์ด์ ํ์ผ ์์ ์(descriptor) ๋ฅผ ๊ทธ ํ์ผ๋ก ๋ฐํํ ๋ ์ฌ์ฉ
- ํ์ผ ! ๊ผญ ํ์ผ ์์คํ ์ ์ด๋ค ํ์ผ์ด ์๋,, ๊ต์ฅํ ๋ณดํธ์ ์ด๋ค
fopen ํจ์ ํจ๋ฐ๋ฆฌ์ ๋ํ ๋ค์ํ ์๊ทธ๋์ฒ
1 2 3 4
FILE* fopen(const char *pathname, const char *mode); FILE* fdopen(int fd, const char *mode); FILE* freopen(const char *pathname, const char *mode, FILE *stream);
๋ชจ๋ ์๊ทธ๋์ฒ๋ mode ์ ๋ ฅ์ ๋ฐ์
- mode : ํ์ผ์ ์ฌ๋ ๋ฐฉ๋ฒ์ ์ ํ๋ ๋ฌธ์์ด
FreeBSD ๋งค๋ด์ผ์ fopen ํจ์
๋ชจ๋ x ๋ C11 ์์ ๋์ ๋จ
- ํ์ผ์ ์ฐ๊ธฐ ์ํด ์ด๋ ค๋ฉด fopen ์ ๋ชจ๋ w ๋๋ w+ ๋ฃ๊ธฐ
- ์ด๋ฏธ ํ์ผ์ด ์กด์ฌํ๋ค๋ฉด,, w ๋๋ w+ ๋ชจ๋๋ ํ์ผ์ ์ญ์ ํจ (๋น์)
- So, ํ์ผ ์ถ๊ฐํ๋ฉด์ ํ์ฌ ๋ด์ฉ ์ ์งํ๋ ค๋ฉด a ๋ชจ๋ ์ฌ์ฉํ๊ธฐ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
$ man 3 fopen ... mode ์ธ์๋ ๋ค์ ๋ฌธ์ ์ค ํ๋๋ก ์์ํ๋ ๋ฌธ์์ด์ ๊ฐ๋ฆฌํต๋๋ค. "r" ์ฝ๊ธฐ ๋ชจ๋๋ก ํ์ผ์ ์ฝ๋๋ค. ์คํธ๋ฆผ์ ํ์ผ์ ๊ฐ์ฅ ์์ ์์นํฉ๋๋ค. ํ์ผ์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ์คํจํฉ๋๋ค. "w" ์ฐ๊ธฐ ๋ชจ๋๋ก ํ์ผ์ ์ฝ๋๋ค. ์คํธ๋ฆผ์ ํ์ผ์ ๊ฐ์ฅ ์์ ์์นํฉ๋๋ค. ํ์ผ์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ํ์ผ์ ์์ฑํฉ๋๋ค. "a" ์ฐ๊ธฐ ๋ชจ๋๋ก ํ์ผ์ ์ฝ๋๋ค. ์คํธ๋ฆผ์ ํ์ผ์ ๊ฐ์ฅ ๋์ ์์นํฉ๋๋ค. fseek(3) ์ด๋ ์ด์ ์ ์ฌํ ๊ฒ๊ณผ ์๊ด์์ด, ํญ์ ํ์ผ์ ํ์ฌ ๋๋ถ๋ถ์์ ํ์ผ ์ด์ด ์ฐ๊ธฐ๊ฐ ๋๋ฉ๋๋ค. ํ์ผ์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ํ์ผ์ ์์ฑํฉ๋๋ค. "r", "w", "a" ๋ค์ "+"์ ์ต์ ์ผ๋ก ์ถ๊ฐํ๋ฉด **์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๋ชจ๋**๋ก ํ์ผ์ ์ฝ๋๋ค. ํ์ผ์ด ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ "w" ๋ค์ "x"๋ฅผ ์ต์ ์ผ๋ก ์ถ๊ฐํ๊ฑฐ๋, "w+"์ ์ฌ์ฉํ๋ฉด fopen()์ด ํธ์ถ๋ฉ๋๋ค. ์์ ์ถ๊ฐ๋ก "" ์ต์ ์ ์ถ๊ฐํ๋ฉด fopen()์ ํธ์ถํด ๊ธฐ๋ณธ ํ์ผ ์์ ์์ FD_CLOEXEC ํ๋๊ทธ๋ฅผ ์ค์ ํฉ๋๋ค. ๋ชจ๋ ๋ฌธ์์ด์ "+"์ด๋ ์ฒซ ๋ฒ์งธ ๊ธ์ ๋ค์์ "b"๋ฅผ ํฌํจํ ์ ์์ต๋๋ค
- ํ์ผ์ ์ฐ๊ธฐ ์ํด ์ด๋ ค๋ฉด fopen ์ ๋ชจ๋ w ๋๋ w+ ๋ฃ๊ธฐ
- ํ์ผ์ด ์กด์ฌํ๋์ง ํ์ธํ ๋, ํ์ผ ์์คํ API ์ฌ์ฉํ์ง ์์ผ๋ฉด์ ํ์ผ ์ด๊ธฐ ์ํ ์์ฉ๊ตฌ ๋ ์ ๊ฒ ์ธ ์ ์์
- ๊ทธ๋ฐ์๋, fopen_s API์ ๋์ ์ด ์์ (์์ ํ fopen ์ญํ ๋ฒ์ โ ๋ฒํผ์ ๊ฒฐํจ ๊ฐ์งํ๊ธฐ ์ํด, ์ ๊ณต๋ ๋ฒํผ์ ๊ทธ ๊ฒฝ๊ณ์ ๋ํ ์ถ๊ฐ ๊ฒ์ฌ ์ํ)
โญ 12.5 ๊ฒฝ๊ณ ๊ฒ์ฌ ํจ์
- ๋ฌธ์์ด๊ณผ ๋ฐ์ดํธ ๋ฐฐ์ด์์ ์๋ํ๋ C ํ๋ก๊ทธ๋จ์ ์ฌ๊ฐํ ๋ฌธ์ ๋..
- ๐จ ๋ฒํผ๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๊ฒฝ๊ณ๋ก ์ฝ๊ฒ ๋์ด๊ฐ ์ ์์
- ๋ฒํผ : ๋ฐ์ดํธ ๋ฐฐ์ด์ด๋ ๋ฌธ์์ด ๋ณ์์ ์๋ฆฌ ํ์์๋ก ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ
- ๋ฒํผ์ ๊ฒฝ๊ณ๋ฅผ ๋์ด๊ฐ๋ฉด โ ๋ฒํผ ์ค๋ฒํ๋ก ๋ฐ์
- ์ด๋ฅผ ํตํด ์ ์ฑ ๊ฐ์ฒด๊ฐ ๊ณต๊ฒฉ โ ๋ฒํผ ์ค๋ฒํ๋ก ๊ณต๊ฒฉ
- ์ด๋ฐ ์ ํ์ ๊ณต๊ฒฉ โ ์๋น์ค ๊ฑฐ๋ถ (DOS) ๋ฐ์, ์ ์ฉ
- strcpy, strcat ๊ฐ์ string.h ์ ์๋ ๋ฌธ์์ด ์กฐ์ ํจ์๋ ๋ฒํผ ์ค๋ฒํ๋ก ๊ณต๊ฒฉ ๋ฐฉ์ง์ ๊ฒฝ๊ณ ๊ฒ์ฌ ๋ฉ์ปค๋์ฆ์ด ๋ถ์กฑํจ
- ๐จ ๋ฒํผ๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๊ฒฝ๊ณ๋ก ์ฝ๊ฒ ๋์ด๊ฐ ์ ์์
- But, C11 ์์ ์๋ก์ด ํจ์๊ฐ ๋์
๋จ
- ๊ฒฝ๊ณ ๊ฒ์ฌ ํจ์ : ๋ฌธ์์ด ์กฐ์ ํจ์์์ ์ด๋ฆ ๋น๋ ค์ด, ๋์ _s ๋ถ์
- _s ์ ๋ฏธ์ฌ : ์ทจ์ฝ์ ์ ์ข
๋ฃํ๊ธฐ ์ํด ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ๋ ๋ง์ด ์ํํ๋ ํจ์๋ฅผ ์์ ํ ๋ฒ์ ์ด๋ผ๊ณ ๊ตฌ๋ถํจ
1 2
errno_t strcpy_s(char *restrict dest, rsize_t destsz, const char *restrict src);
- ์ฒซ ๋ฒ์งธ ์ธ์ : ๋ณต์ฌํ ๋ฌธ์์ด (๋ค๋ฅธ ๋ณ์, ๋ฉ๋ชจ๋ฆฌ)
- ๋ ๋ฒ์งธ ์ธ์ : dest ๋ฒํผ์ ๊ธธ์ด
- ํจ์๋ ํ ๋น๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ง ์๋๋ก dest ๋ฒํผ์ ํฌ๊ธฐ๋ณด๋ค src ๋ฌธ์์ด์ด ์งง๊ฑฐ๋ ๊ฐ์์ง ํ์ธ ๋ฑ ๋ฐํ์ ๊ฒ์ฌ ์ํํจ
- ๋ณต์ฌ๋ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ์ ์ด์ผ ํจ!
- ์ธ ๋ฒ์งธ ์ธ์ : ์๋ณธ ๋ฌธ์์ด
- _s ์ ๋ฏธ์ฌ : ์ทจ์ฝ์ ์ ์ข
๋ฃํ๊ธฐ ์ํด ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ๋ ๋ง์ด ์ํํ๋ ํจ์๋ฅผ ์์ ํ ๋ฒ์ ์ด๋ผ๊ณ ๊ตฌ๋ถํจ
- ๊ฒฝ๊ณ ๊ฒ์ฌ ํจ์ : ๋ฌธ์์ด ์กฐ์ ํจ์์์ ์ด๋ฆ ๋น๋ ค์ด, ๋์ _s ๋ถ์
โญ 12.6 ๊ฐ์ ๋ฐํํ์ง ์๋ ํจ์
- ํจ์ ํธ์ถ์ return ํค์๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ํจ์์ ๋ธ๋ก ๋์ ๋๋ฌํ๋ฉด ์ข ๋ฃ
- ํธ์ถ์ด ์ ๋ ๋๋์ง ์์ ๋๋ ์๋๋ฐ, ๋ณดํต์ ์ด๋ค ์๋๋ฅผ ๊ฐ์ง๊ณ ์ผ๋ถ๋ฌ ์ํํจ
๊ฐ์ ๋ฐํํ์ง ์๋ ํจ์
1 2 3 4 5 6 7 8 9 10 11
void main_loop() { while (1) { ... } } int main(int argc, char** argv) { ... main_loop(); return 0; }
- main_loop() ํจ์๋ ํ๋ก๊ทธ๋จ์ ์ฃผ์ ์์
์ํํ๊ณ ํจ์์์ ๋์์ค๋ฉด ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋จ
- ์ด๋ฐ ๊ฒฝ์ฐ์ ์ปดํ์ผ๋ฌ๋ ์ต์ ํ ๋ ๋ง์ด ์ํํจ
- But, main_loop() ๋ ์ด๋ป๊ฒ๋ ์ ๋ ๋ณํ๋์ง ์์
- C11 ์์๋ ๊ฐ์ ๋ฐํํ์ง ์๋ ํจ์๋ผ๊ณ ํ์๋๋ ๊ธฐ๋ฅ์ด ์์
- stdnoreturn.h ํค๋ ํ์ผ์ _Noreturn ํค์๋๋ฅผ ์ฌ์ฉํด ์ ๋ ์ข ๋ฃ๋์ง ์๋ ํจ์ ์ง์ ํจ
- main_loop ๋ฅผ ๋๋์ง ์๋ ํจ์๋ก ํ์ํ๋ _Noreturn ํค์๋ ์ฌ์ฉํ๊ธฐ
1 2 3 4 5
_Noreturn void main_loop() { while (true) { ... } }
- ํ๋ก๊ทธ๋จ์ ๋น ๋ฅธ ์ข
๋ฃ๋ฅผ ์ํด C11 ์์ ์ต๊ทผ์ ์ถ๊ฐ๋จ
- exit, quick_exit, abort โ ๊ฐ์ ๋ฐํํ์ง ์๋ ํจ์๋ก ๊ฐ์ฃผํจ
- ๋ฐํ๊ฐ์ด ์๋ ํจ์์ ์กด์ฌ๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ์๊ณ ์๋ค๋ฉดโ ์๋์น ์๊ฒ ๋ฐํ๊ฐ์ด ์๋ ํจ์ ํธ์ถ์ ์ธ์ํ ์ ์์ โ ๋ ผ๋ฆฌ์ ๋ฒ๊ทธ์ ๋ํ ์ ํธ โ ์ ์ ํ๊ฒ ๊ฒฝ๊ณ ํจ ๐จ
- But, _Noreturn ์ผ๋ก ํ์ํ ํจ์๊ฐ ๋ฐํ๊ฐ์ด ์๋ค๋ฉด ์ ์๋์ง ์์ ํ์ โ ๊ถ์ฅ X
- ํ๋ก๊ทธ๋จ์ ๋น ๋ฅธ ์ข
๋ฃ๋ฅผ ์ํด C11 ์์ ์ต๊ทผ์ ์ถ๊ฐ๋จ
- main_loop() ํจ์๋ ํ๋ก๊ทธ๋จ์ ์ฃผ์ ์์
์ํํ๊ณ ํจ์์์ ๋์์ค๋ฉด ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋จ
โญ 12.7 ํ์ ์ ๋ค๋ฆญ ๋งคํฌ๋ก
C11 ์์ _Generic ์ด๋ผ๋ ์ ํค์๋ ๋์
- ์ปดํ์ผ ํ๋ ๋์ ์๋ฃํ์ ์ธ์ํ๋ ๋งคํฌ๋ก๋ฅผ ์์ฑํ๋๋ฐ ์ฌ์ฉํจ
์ธ์์ ์๋ฃํ์ ๋ฐ๋ผ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๋งคํฌ๋ก๋ฅผ ์์ฑํ ์ ์์ โ ์ผ๋ฐ (Generic) ์ ํ
์ ๋๋ฆญ ๋งคํฌ๋ก์ ์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#include <stdio.h> #define abs(x) _Generic((x), int: absi, double: absd)(x) int absi(int a) { return a > 0 ? a : -a; } double absd(double a) { return a > 0 ? a : -a; } int main(int argc, char** argv) { // C์์ ์ค๋ฒ๋ก๋ฉ ๋์ฒด์ฉ -> ํ์ ์ ๋๋ฆญ ๋งคํฌ๋ก printf("abs(-2): %d\n", abs(-2)); printf("abs(2.5): %f\n", abs(2.5)); return 0; } // abs(-2): 2 // abs(2.5): 2.500000
- x ์ธ์์ ์๋ฃํ์ ๋ฐ๋ผ ๋ค๋ฅธ ํํ์ ์ฌ์ฉํจ
- ์ ์๊ฐ์ด๋ฉด absi
- double ๊ฐ์ด๋ผ๋ฉด absd
- C11 ์ ์๋ก์ด ๊ธฐ๋ฅ์ด ์๋์๊ณ ์ด์ ์๋ ๋ณผ ์ ์์์ผ๋ C ํ์ค์ ์์ํ์ (์ง๊ธ์ ํ์ค์ด ๋์์) โ So, ์๋ฃํ์ ์ธ์ํ๋ ๋งคํฌ๋ก ์์ฑ์ด ๊ฐ๋ฅ
- x ์ธ์์ ์๋ฃํ์ ๋ฐ๋ผ ๋ค๋ฅธ ํํ์ ์ฌ์ฉํจ
โญ 12.8 ์ ๋์ฝ๋
- C11 ํ์ค์ ์ถ๊ฐ๋ ์ค์ํ ๊ธฐ๋ฅ ์ค ํ๋ UTF-8, UTF-16, UTF-32 ์ธ์ฝ๋ฉ์ ํตํ ์ ๋์ฝ๋ ์ง์
- C11 ์ด์ ์๋ IBM ์ ๋์ฝ๋ ๊ตญ์ ์ปดํฌ๋ํธ (ICU)์ ๊ฐ์ ์๋ ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํจ
- ์์คํค์ ์์คํค ํ์ฅ ๋ฌธ์๋ฅผ ์ ์ฅํ๋ 8๋นํธ ๋ณ์์ธ char์ unsigned char ํ๋ง ์์์ต๋๋ค.
- ํ์ฅ๋ฌธ์: 255 ์ดํ์ ํด๋นํ๋ ์ซ์ฃ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด 1๋ฐ์ดํธ ์ด์์ ๋ ์ฌ์ฉํ๋ ๋ฌธ์.
- UTF-8 UTF-16์ ๊ฐ๋ณ ๊ธธ์ด ์ธ์ฝ๋ฉ์ด๋ผ๊ณ ํฉ๋๋ค.
- ๋ฌธ์ ๋น 1๋ฐ์ดํธ ๋ฏธ๋ง์ ์ฌ์ฉํ๋ ์ด๊ธฐ ๊ฐ๋ณ ๊ธธ์ด ์ธ์ฝ๋ฉ์ ์ข ์ข ์ด๊ธฐย ๋ง์ดํฌ๋ก์ปดํจํฐ์ฉย ์ด๋๋ฒค์ฒ ๊ฒ์์์ ์์ด ํ ์คํธ๋ฅผ ๋ ์ ์ ๋ฐ์ดํธ๋ก ํจํน(pack)ํ๊ธฐ ์ํด ์ฌ์ฉ๋จ
- UTF-8์ ์์คํค์ ์์ ์งํฉ์ผ๋ก ๋ด
๋๋ค. ์ด๋ ์์คํค ๋ฌธ์(ํ์ฅ ์์คํค ๋ฌธ์๋ ์๋๋๋ค.)์ ํํ์ด ๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค.
- UTF-16์ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ํ๋ ๋๋ 2๊ฐ์ ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.(๊ฐ ์๋๋ 16๋นํธ๋ฅผ ๊ฐ์ต๋๋ค
- ์ฌ์ฉํ๋ 32๋นํธ CPU(ARM ๋ฑ)๋ผ๋ฉด ์๋๋ 32๋นํธ๊ฐ ๋๋ค
- UTF-32๋ ๋ชจ๋ ๋ฌธ์์ ๋ํ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ์ ํํ 4๋ฐ์ดํธ๋ก ๊ณ ์ ํฌ๊ธฐ ์ธ์ฝ๋ฉ์ ๋๋ค.
- UTF-8์ UTF-16์ ์์ฃผ ๋์ค๋ ๋ฌธ์์ ๋ ์์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์์ฉํ๋ก๊ทธ๋จ์ ์ ํฉํฉ๋๋ค.
- UTF-32์ UTF-8์ UTF-16์ ๋นํด ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋นํฉ๋๋ค. ํ์ง๋ง UTF-8์ UTF-16์ ์์ถ ์ธ์ฝ๋ฉ์ด๋ผ์ ๋ ๋ง์ ์ฐ์ฐ์ ํด์ผํฉ๋๋ค.
โญ 12.9 ์ต๋ช ๊ตฌ์กฐ์ฒด์ ์ต๋ช ๊ณต์ฉ์ฒด
- ์ต๋ช ๊ตฌ์กฐ์ฒด์ ์ต๋ช ๊ณต์ฉ์ฒด๋ ์ด๋ฆ์ ๊ฐ์ง ์๋ ์๋ฃํ ์ ์๋ก, ๋ณดํต ๋ค๋ฅธ ์๋ฃํ ๋ด์์ ์ค์ฒฉ ์๋ฃํ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
1
2
3
4
5
6
7
8
9
typedef struct {
union {
struct {
int x;
int y;
};
int data[2];
};
} point_t;
- union๊ณผ struct์ ์ด๋ฆ์ด ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
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
/* File name: ExtremeC_examples_chapter12_4.c
* Description: Anonymous structures and unions
*/
#include <stdio.h>
typedef struct {
union {
struct {
int x;
int y;
};
int data[2];
};
} point_t;
int main(int argc, char** argv) {
point_t p;
p.x = 10;
p.data[1] = -5;
printf("Point (%d, %d) using anonymous structure.\n", p.x, p.y);
printf("Point (%d, %d) using anonymous byte array.\n",
p.data[0], p.data[1]);
return 0;
}
โญ 12.10 ๋ฉํฐ์ค๋ ๋ฉ
- C์์ ๋ฉํฐ ์ค๋ ๋ฉ์ POSIX ์ค๋ ๋ฉ ํจ์ ๋๋ pthread ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ค๋ซ๋์ ์ง์์ด ๋์์ต๋๋ค.
- POSIX ์ค๋ ๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฆ ๊ทธ๋๋ก ๋ฆฌ๋ ์ค๋ ์ ๋์ค ๊ณ์ด ์์คํ ๊ณผ ๊ฐ์ POSIXํธํ ์์คํ ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์๋์ฐ์ ๊ฐ์ด POSIX ํธํ ์์คํ ์ด ์๋ ๊ฒฝ์ฐ ์ด์์ฒด์ ๊ฐ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
- C11์์๋ POSIX์ ํธํ๊ณผ ์๊ด์์ด ํ์ค C๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์์คํ ์์ ์ฌ์ฉํ ์ ์๋ ํ์ค ์ค๋ ๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. C11ํ์ค์์ ๋ณผ ์ ์๋ ๊ฐ์ฅ ํฐ ๋ณํ์ ๋๋ค.
- ์ ๊ฐ์ค๋ฝ๊ฒ๋ C11 ์ค๋ ๋ฉ์ ๋ฆฌ๋ ์ค์ macOS์์๋ ๊ตฌํ๋์ง ์์์ต๋๋ค.
- C18 ํ์ค์ C11์์ ์์ ํ ๋ชจ๋ ๋ด์ฉ์ ํฌํจํ๋ฉฐ, ์๋ก์ด ๊ธฐ๋ฅ์ ๋์ ๋์ง ์์์ต๋๋ค.
This post is licensed under CC BY 4.0 by the author.