Post

๐Ÿข 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 ๋ฒ„์ „์„ ๊ฐ์ง€ํ•˜๊ณ , ๋ฒ„์ „์— ๋”ฐ๋ผ์„œ ์ง€์›๋˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ• ์•Œ์•„๋ณด์ž โ—

    1. ๋จผ์ € ํ˜„์žฌ ์–ด๋–ค ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ

      1. ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” gcc, macOS ์—์„œ๋Š” clang ์‚ฌ์šฉ
      2. ํ˜„์žฌ 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,, ์—”ํ„ฐ ์ž…๋ ฅ ์ „๊นŒ์ง€ ๋งŽ์€ ๊ฐ’ ์ž…๋ ฅ.. โ‡’ ์‚ฌ์šฉ์ž์˜ ๊ณผ๋„ํ•œ ์ž…๋ ฅ์ด ๊ฒฐ๊ตญ ๐Ÿšจ ๋ฒ„ํผ ์˜ค๋ฒ„ ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐœ์ƒ
      • ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ ๊ณต๊ฒฉ์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค
      • ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๊ฐ€ ์—†๊ณ  ํ˜ธ์ถœ ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค์Œ์— ์˜ฌ ํ–‰์˜ ๊ธธ์ด๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ๊ฒฐ์ •ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋งŒํผ, ์ด ํ•จ์ˆ˜๋Š” ์•…์„ฑ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ ๊ณต๊ฒฉ์„ ํ†ตํ•ด ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋Šฅ์„ ์ž„์˜๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ
    • ๋ฐ˜๋ฉด์— fgets ํ•จ์ˆ˜๋Š” ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ ๋จ
      • fgets ํ•จ์ˆ˜
        • FILE ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์—์„œ ๋ฌธ์ž์—ด์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜
          char*fgets(char* str,int numChars, FILE* stream);
          char*fgets(char* str,int numChars, stdin);   // ํ‚ค๋ณด๋“œ๋กœ๋„ ์ž…๋ ฅ ๊ฐ€๋Šฅ
          
          1. ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜(str) : ํŒŒ์ผ์—์„œ ์ฝ์€ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•  ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ฒจ์ฃผ๊ธฐ
          2. ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜(numChars) : ์ €์žฅํ•  ๋ฌธ์ž์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •
          3. ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜(stream) : ํŒŒ์ผ์—์„œ ๋ฌธ์ž์—ด์„ ์ฝ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ํŒŒ์ผ ํฌ์ธํ„ฐ
            • FILE ๊ตฌ์กฐ์ฒด ์‚ฌ์šฉํ•˜๋ฉฐ, ํ…์ŠคํŠธ ํŒŒ์ผ ๊ด€๋ฆฌํ•˜๋Š” ํฌ์ธํ„ฐ
          4. ๊ฒฐ๊ณผ๋ฅผย string์— ์ €์žฅํ•˜๊ณ  ์ŠคํŠธ๋ง ๋์— ๋„(null) ๋ฌธ์ž(\0)๋ฅผ ์ถ”๊ฐ€

โญ 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"๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
          
    • ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ๋•Œ, ํŒŒ์ผ ์‹œ์Šคํ…œ 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 ๋ฌธ์ž์—ด์ด ์งง๊ฑฐ๋‚˜ ๊ฐ™์€์ง€ ํ™•์ธ ๋“ฑ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ ์ˆ˜ํ–‰ํ•จ
          • ๋ณต์‚ฌ๋  ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ์ ์–ด์•ผ ํ•จ!
        • ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜ : ์›๋ณธ ๋ฌธ์ž์—ด

โญ 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

โญ 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, ์ž๋ฃŒํ˜•์„ ์ธ์‹ํ•˜๋Š” ๋งคํฌ๋กœ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅ

โญ 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.