翻蚳è
ããïŒãã®åºçç©ã¯ã Inoventica Servicesããã°ã§èšäºãHow to C in 2016ãã®ç¿»èš³ãåºçãããåŸã«èªçºçã«çºçããã·ãªãŒãºã®3çªç®ã®æçµèšäºã§ãã ããã§ãåæã§è¿°ã¹ãããè«æã®ããã€ããæ¹å€ãããæåã®åºçç©ã®èè
ãæèµ·ãã質åã«é¢ããæèŠã®æçµçãªãåçããšC.ã§ã®ã³ãŒãã®èšè¿°æ¹æ³ãæçµçã«åœ¢æãããŸãã ç§ãæãã«ã CodeRushãŠãŒã¶ãŒã®å€ãã®éŠŽæã¿ã®ãããŠãŒã¶ãŒã«ãã£ãŠäžããããããã¹ããžã®ãã³ãã§ãã2çªç®ã®åºçç©ã¯ããã«ãããŸã ããããïŒå°ãªããšãç§ã®ç¥ãéããèè
ã®å§ã瀺ãããŠããªãWebãµã€ãïŒã¯ãã2016幎ã®Cã§ã®ããã°ã©ãã³ã°ããšããèšäºãå
¬éããŸãããããã¯åŸã«RedditãšHacker Newsã«æ²èŒãããŸããã
ã¯ããCããã°ã©ãã³ã°ãééãªããè°è«ãããããšãã§ããŸãããç§ã¯æããã«å察ããåŽé¢ããããŸãã ãã®éèŠãªèšäºã¯å»ºèšçãªè°è«ã§æžãããŠããŸãã å Žåã«ãã£ãŠã¯ãããããæ£ããå¯èœæ§ããããç§ã¯ééã£ãŠããŸãã
Mattã®åºçç©å
šäœãåŒçšããããã§ã¯ãããŸããã ç¹ã«ãç§ãåæããããã€ãã®ç¹ãçç¥ããããšã«ããŸããã å§ããŸãããã
Cã§ã®ããã°ã©ãã³ã°ã®æåã®ã«ãŒã«ã¯ãä»ã®ããŒã«ã§åé¡ããªããã°äœ¿çšããªãããšã§ãã
ç§ã¯ãã®å£°æã«åæããŸããããããã¯è°è«ããã«ã¯åºããããããã¯ã§ãã
Cã§ããã°ã©ãã³ã°ããå Žåã lang
ã¯ããã©ã«ãã§C99ãåç
§ãããããè¿œå ã®ãªãã·ã§ã³ã¯å¿
èŠãããŸããã
clang
ã®ããŒãžã§ã³ã«ãã£ãŠç°ãªããŸã
clang 3.6
ããã©ã«ãã§C99ã§åäœãã
clang 3.6
ã¯C11ã§åäœããŸãã ç®±ããåºããŠäœ¿çšãããšãã«ã©ãã»ã©å³ãããã®ãããããŸããã
gccãŸãã¯clangã«ç¹å®ã®æšæºã䜿çšããå¿
èŠãããå Žåã¯ãè€éã«ããªãã§ãstd = cNN -pedanticã䜿çšããŠãã ããã
ããã©ã«ãã§ã¯ã gcc-5
ã¯-std=gnu11
èŠæ±ããŸãããå®éã«ã¯GNUãªãã§c99ãŸãã¯c11ãæå®ããå¿
èŠããããŸãã
ååãšããŠããããã®ç®çã«éåžžã«é©ããŠããç¹å®ã®gccæ¡åŒµæ©èœã䜿çšããããªãå Žåãé€ããŸãã
æ°ããã³ãŒãã§char
ã int
ã short
ã long
ãŸãã¯unsigned
ãããªãã®ãèŠã€ããå Žåãããã«ãšã©ãŒããããŸãã
ãã¡ãããã¿ãŸããããããã¯ãã³ã»ã³ã¹ã§ãã ç¹ã«ãintã¯çŸåšã®ãã©ãããã©ãŒã ã§æãåãå
¥ããããæŽæ°ããŒã¿åã§ãã å°ãªããšã16ãããã®é«é笊å·ãªãæŽæ°ã«ã€ããŠè©±ããŠããå Žåãintã䜿çšããŠãäœãåé¡ã¯ãããŸããïŒãŸãã¯ã
int_least16_t
ãªãã·ã§ã³ãåç
§ã§ããŸããããã¯ãåãã¿ã€ãã®é¢æ°ã§åé¡
int_least16_t
ãŸããã
int_least16_t
ã®æ¹ã䟡å€ããããŸãïŒã
ææ°ã®ããã°ã©ã ã§ã¯ã #include <stdint.h>
ãæå®ããŠãããæšæºã®ããŒã¿åãéžæããå¿
èŠããããŸãã
int
ã¹ãã«ã
«std»
ã¯ãªããšããäºå®ã¯ãéæšæºçãªãã®ãæ±ã£ãŠãããšããæå³ã§ã¯ãããŸããã
int
ã
long
ãªã©ã®ã¿ã€ãã¯Cèšèªã«çµã¿èŸŒãŸãã
<stdint.h>
ä¿®æ£ãããtypedefã¯è¿œå æ
å ±ãšããŠåŸã§è¡šç€ºãããŸãã ããã¯ãçµã¿èŸŒã¿ã®åããããæšæºãã§ã¯ãããŸããããããã€ãã®ç¹ã§ã¯åŸè
ããå£ã£ãŠããŸãã
float
-32ãããæµ®åå°æ°ç¹æšæº
double
-64ãããæµ®åå°æ°ç¹æšæº
float
ããã³
double
ã¯ã32ãããããã³64ãããæµ®åå°æ°ç¹æšæºã®éåžžã«äžè¬çãªIEEEã¿ã€ãã§ããç¹ã«ãææ°ã®ã·ã¹ãã ã§ã¯ãCã§ããã°ã©ãã³ã°ãããšãã«ããã«ãã ããããšã¯ãããŸãããç§ã¯ãfloatã64ãããã§äœ¿çšãããã·ã¹ãã ã§äœæ¥ããŸããã
泚æããŠãã ããïŒãã以äžã®char.
éåžžãCããã°ã©ãã³ã°èšèªã§ã¯ã char
ã³ãã³ãã¯åŒã³åºãããã ãã§ãªãã誀ã£ãŠäœ¿çšãããŸãã
æ®å¿µãªãããCã§ããã°ã©ãã³ã°ãããšãã«ãã©ã¡ãŒã¿ãŒãšãã€ããããŒãžããããšã¯é¿ããããŸããã charåã¯å®å®ããŠ1ãã€ããšèŠãªãããŸããããã€ããã¯å°ãªããšã8ãããã§ãã
ãœãããŠã§ã¢éçºè
ã¯ã笊å·ãªãã®ãã€ãæäœãå®è¡ãããå Žåã§ããcharã³ãã³ãã䜿çšããŠããã€ãããæå³ãç¶ããŸãã åã
ã®ç¬Šå·ãªããã€ã/ãªã¯ãããå€ã«uint8_t
ãæå®ãã笊å·ãªããã€ã/ãªã¯ãããå€ã®ã·ãŒã±ã³ã¹ã«uint8_t *
ãéžæããæ¹ãã¯ããã«æ£ç¢ºã§ãã
ãã€ããå«ãŸããŠããå Žåã¯ã
unsigned char
䜿çšããŸãã ãªã¯ãããã®å Žåã
uint8_t
éžæããŸãã
CHAR_BIT > 8
å Žåã
uint8_t
ãäœæã§ããŸãããã€ãŸããæ©èœãããã³ãŒããã³ã³ãã€ã«ã§ããŸããïŒããããããããŸãã«å¿
èŠãªãã®ã§ãïŒã 8ããã以äžã®ãªããžã§ã¯ãã
uint_least8_t
å Žåã¯ã
uint_least8_t
䜿çšã
uint_least8_t
ã ãã€ãããªã¯ããããæå³ããå Žåã次ã®ãããªã³ãŒããã³ãŒãã«è¿œå ããŸãã
#include <limits.h> #if CHAR_BIT != 8 #error #endif
泚ïŒPOSIXã¯
CHAR_BIT == 8
èŠæ±ããŸãã
Cããã°ã©ãã³ã°èšèªã§ã¯ãæååãªãã©ã«("hello")
ã¯char *
ããã«èŠããŸãã
ããããæååãªãã©ã«ã¯char []ã«èšå®ãããŸãã ç¹ã«ããhelloãã®å Žåãchar [6]ã§ãã é
åã¯ãã€ã³ã¿ãŒã§ã¯ãããŸããã
unsigned
ã䜿çšããŠã³ãŒããèšè¿°ããããšããªãã§ãã ããã ããã§ãã³ã³ãã³ããèªã¿ã«ããããã ãã§ãªããå®æåã䜿çšããå¹çæ§ã«çåãæããããå€æ°ã®ããŒã¿åã䜿çšããŠãåä»ãªCã®èŠåãªãã«ãŸãšããªã³ãŒããèšè¿°ããæ¹æ³ãããããŸããã
Cã®å€ãã®åã«ã¯ãããã€ãã®åèªã§æ§æãããååãä»ããããŸãã ããã«åé¡ã¯ãããŸããã äœèšãªæåãå
¥åããã®ãé¢åãªå Žåãããã¯ããããçš®é¡ã®ç¥èªãã³ãŒãã«è©°ã蟌ãå¿
èŠããããšããæå³ã§ã¯ãããŸããã
åçŽãªuint64_t
å¶éã§ããå Žåã誰ãunsigned long long intãå
¥åããŸããïŒ
äžæ¹ã§ã¯ãintãæå³ããunsigned long longã䜿çšã§ããŸãã åæã«ããããã¯ç°ãªããã®ã§ããã
unsigned long long
åã¯å°ãªããšã64ãããã§ãããã€ã³ãã³ããååšããå Žåãšååšããªãå ŽåããããŸãã
uint64_t
ãã€ã³ãã³ãããããªãã§ãæ£ç¢ºã«64ãããçšã«èšèšãããŠããŸãã ãã®ã¿ã€ãã¯ãå¿
ãããããããã®ã³ãŒãã«ç»é²ãããŠããããã§ã¯ãããŸããã
unsigned long long
Cã®çµã¿èŸŒã¿åã§ãããã®ããã°ã©ãã³ã°èšèªã䜿çšããå°é家ã¯ããã®èšèªã«ç²ŸéããŠããŸãã
ãŸãã¯ã
uint_least64_t
è©ŠããŠ
uint_least64_t
ãããã¯ã
unsigned long long
ãšåäžãŸãã¯ç°ãªãå ŽåããããŸãã
ã¿ã€ã<stdint.h>
ãããå
·äœçãã€æ£ç¢ºãªæå³ãæã¡ãäœè
ã®æå³ãããããäŒããã³ã³ãã¯ãã§ãããæäœãšèªã¿ãããã®äž¡æ¹ã«ãšã£ãŠéèŠã§ãã
ãã¡ããã
intN_t
åãš
uintN_t
å
uintN_t
ããå
·äœçã§ãã ãããããã¹ãŠã®ã³ãŒããäž»ãªãã®ã§ã¯ãããŸããã ããªãã«ãšã£ãŠéèŠã§ã¯ãªããã®ãæå®ããªãã§ãã ããã
uint64_t
ã¯ãå®éã«æ£ç¢ºã«64ããããå¿
èŠãªå Žåã«ã®ã¿éžæããŠ
uint64_t
ã
ç¹å®ã®åœ¢åŒã«é©å¿ããå¿
èŠãããå Žåãªã©ãæ£ç¢ºãªé·ãã®åãå¿
èŠã«ãªãããšããããŸãïŒãã€ãé ãèŠçŽ ã®é
眮ãªã©ã«éç¹ã眮ãããããšããããŸããCã®<stdint.h>ã¯ãç¹å®ã®ãã©ã¡ãŒã¿ãŒãèšè¿°ããæ©èœãæäŸããŸããïŒã ã»ãšãã©ã®å Žåãçµã¿èŸŒã¿å[u] int_leastN_tãŸãã¯[u] int_leastN_tãé©ããŠããç¹å®ã®ç¯å²ã®å€ãæå®ããã ãã§ååã§ãã
ãã®å Žåã®ãã€ã³ã¿ãŒã®æ£ããã¿ã€ãã¯uintptr_t
ã§ããã¡ã€ã«<stdint.h>
ã«ãã£ãŠèšå®ãããŸãã
ãªããšããã²ã©ãééãã
å°ããªãšã©ãŒããå§ããŸãããïŒ
uintptr_t
ã¯
<stddef.h>
ã§ã¯ãªã
<stddef.h>
<stdint.h>
ã«èšå®ãããŸãã
ããã¯ã詳现ã«ã€ããŠã®è©±ã§ãã ããŒã¿ã倱ãããšãªã
void*
ãå¥ã®æŽæ°åã«å€æã§ããªãã³ãã³ããåŒã³åºãããšã¯ã
uintptr_t
ã«ãã£ãŠæ±ºå®ãããããšã¯ã»ãšãã©ãããŸããïŒãã®ãããªå Žåã¯ãéåžžã«ãŸãã§ãïŒã
代ããã«ïŒ
long diff = (long)ptrOld - (long)ptrNew
ã¯ããããã§ã¯ãããŸããã
䜿çšïŒ
ptrdiff_t diff = (uintptr_t)ptrOld - (uintptr_t)ptrNew
ãããããã®ãªãã·ã§ã³ã¯åªããŠããŸãã
åã®éãã匷調ãããå Žåã¯ã次ã®ããã«æžããŸãã
ptrdiff_t diff = ptrOld - ptrNew;
ãã€ãã«éäžããå¿
èŠãããå Žåã¯ã次ã®ãããªãã®ãéžæããŸãã
ptrdiff_t diff = (char*)ptrOld - (char*)ptrNew
ptrOld
ããã³
ptrNew
ãå¿
èŠãªãã©ã¡ãŒã¿ãŒã瀺ããªãå ŽåããŸãã¯åã«ãªããžã§ã¯ãã®æåŸãããžã£ã³ãããå Žåããã€ã³ã¿ãŒãããŒã¿æžç®ã³ãã³ããåŒã³åºãæ¹æ³ããã¬ãŒã¹ããããšã¯å°é£ã§ãã
uintptr_t
åãæ¿ãããšãå°ãªããšãçžå¯Ÿçãªçµæãä¿èšŒãããŸãããéåžžã«æçšãšã¯èšããŸããã ãã€ã³ã¿ãŒã䜿çšããæ¯èŒãŸãã¯ãã®ä»ã®ç®è¡ã¯ãé«ã¬ãã«ã·ã¹ãã çšã®ã³ãŒããèšè¿°ããå Žåã«ã®ã¿èš±å¯ãããŸããããã§ãªãå Žåã¯ã調æ»äžã®ãã€ã³ã¿ãŒãç¹å®ã®ãªããžã§ã¯ãã®æ«å°Ÿãåç
§ããããããããã¹ãããããããšãéèŠã§ãïŒäŸå€ïŒ==ããã³ïŒç°ãªããªããžã§ã¯ãïŒã
ãã®ãããªç¶æ³ã§ã¯ãintptr_tïŒãã©ãããã©ãŒã äžã®åèªã«çããå€ã«å¯Ÿå¿ããæŽæ°ããŒã¿åïŒãåç
§ããã®ãåççã§ãã
ãããããããŸããã ãåèªãšçããããšããæŠå¿µã¯éåžžã«æœè±¡çãªãã®ã§ãã
intptr_t
ããŒã¿æ倱ãªãã§
void*
ã
intptr_t
ããŸãã¯ãã®éã«æ£åžžã«å€æ
intptr_t
笊å·ä»ãæŽæ°åã§ãã ããã«ãããã¯
void*
ãè¶
ããå€ã«ãªãå ŽåããããŸãã
32ããããã©ãããã©ãŒã ã§intptr_t
ã intptr_t
int32_t
å€æãããŸãã
ããã¯èµ·ãããŸãããåžžã«ã§ã¯ãããŸããã
64ããããã©ãããã©ãŒã ã§ã¯ã intptr_t
ã¯int64_t
ãŸãã
ç¹°ãè¿ãã«ãªããŸãããå¿
èŠã§ã¯ãããŸããã
å®éã size_t
ã¯ã巚倧ãªé
åã€ã³ããã¯ã¹ãæ ŒçŽã§ããæŽæ°ãã®ãããªãã®ã§ãã
ãã
ãã®ãããäœæäžã®ããã°ã©ã ã®åãã®å°è±¡çãªææšãä¿®æ£ã§ããŸãã
ã¯ãããã®ã¿ã€ãã®ããŒã¿ã䜿çšãããšãããã°ã©ã ã®èµ·åã«é¢ä¿ããæ倧ã®ãªããžã§ã¯ãã®ãµã€ãºã«é¢ããæ
å ±ãä¿åã§ããŸãïŒããã
ãªãã·ã§ã³ã§ãããšããæèŠããã
ãŸãããå®éã«ã¯ãããããŸãã«èµ·ãããšä»®å®ããããšãã§ããŸãïŒã ãã¹ãŠã®ãªãã»ãããåããªããžã§ã¯ãå
ã§äœæãããå Žåãã¡ã€ã³ã¡ã¢ãªãªãã»ãããä¿®æ£ã§ããŸãã
ãããã®å Žåã§ããææ°ã®ãã©ãããã©ãŒã ã§ã¯ã size_t
ã¯uintptr_t
ãšå®è³ªçã«åãç¹æ§ãæã€ããã32ãããããŒãžã§ã³ã§size_t
ã size_t
uint32_t
ã64ãããuint64_t
ã¯uint64_t
ãŸãã
æãå¯èœæ§ãé«ãããå¿
èŠã§ã¯ãªãã
ããå
·äœçã«ã¯ã
size_t
ã¯åã
ã®ãªããžã§ã¯ãã®ãµã€ãºãä¿åããããã«äœ¿çšã§ããŸããã
uintptr_t
ã¯ãã€ã³ã¿ãŒå€ãèšå®ããããã«å¿ããŠããŸããŸãªãªããžã§ã¯ãã®ãã€ãã®ã¢ãã¬ã¹ãæ··åããªããªããŸãã ææ°ã®ã·ã¹ãã ã®ã»ãšãã©ã¯ãåå²ã§ããªãã¢ãã¬ã¹è¡ã§åäœãããããçè«çã«ã¯ããªããžã§ã¯ãã®æ倧ãµã€ãºã¯åèšã¡ã¢ãªãµã€ãºã«çãããªããŸãã Cããã°ã©ãã³ã°æšæºã§ã¯ããã®èŠä»¶ãå³å®ããå¿
èŠããããŸãã ãã®ãããããšãã°ã64ãããã·ã¹ãã äžã§ãªããžã§ã¯ãã32ããããè¶
ããªãå ŽåããããŸãã
ãã¢ãã³ããšããèšèã匷調ããå€ãéžæè¢ïŒx86ãªã©ããã¢ãã€ã³ã¿ãŒãšãã¡ãŒãã€ã³ã¿ãŒã䜿çšããã»ã°ã¡ã³ãåãããã¢ãã¬ã¹æå®ã䜿çšïŒãèªåçã«çç¥ããCæšæºãšã®äºææ§ãæäŸããå¯èœæ§ã®ããå°æ¥ã®è£œåã«ã€ããŠã¯è§ŠããŠããŸããããå®çŸ©ãè¶
ããŠããŸããã¢ãã³ã
æäœäžã¯ããŒã¿åãåç
§ããªãã§ãã ããã åžžã«é©åãªã¿ã€ãã®ãã€ã³ã¿ãŒã䜿çšããŠãã ããã
ããã¯éžæè¢ã®1ã€ã§ãããæåããå¯äžã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããïŒãããŠã確ãã«ããïŒ
pãã«void *ãèšè¿°ããå¿
èŠãããããšã«åæããã§ãããïŒã
ãã€ã³ã¿ãŒã®åæå€ã¯ïŒ
pã§ãïŒææ°ã®ã³ã³ãã€ã©ãŒã§ã¯ã16é²ã·ã¹ãã ã§è¡šç€ºãããŸããæåã¯ãã€ã³ã¿ãŒãvoid *
éä¿¡ããŸãïŒ
çŽ æŽããããã³ã-åºå圢åŒã®ã¿ãèµ·åãªãã·ã§ã³ã«ãã£ãŠèšå®ãããŸãã ããã¯éåžž16é²å€ã§ãããä»ã«äœãæå®ãããŠããªããšã¯æããªãã§ãã ããã
printf("Local number: %" PRIdPTR "\n\n", someIntPtr)
someIntPtr
ãšããååã¯
int*
åãæå³ããå®éã«ã¯
intptr_t
åãæå®ããŸãã
ãããã¯ã«ã¯ããŸããŸãªããªãšãŒã·ã§ã³ããããŸããã€ãŸãããã¯ãåã®ç¡éã®çµã¿åãããèŠããå¿
èŠã¯ãããŸããã
some_signed_type n; some_unsigned_type u; printf("n = %jd, u = %ju\n", (intmax_t)n, (uintmax_t)u);
intmax_t
ãš
uintmax_t
ã¯éåžž64ãããã§ãã ãããã®å€æã¯ãç©ççãªI / Oãããã¯ããã«çµæžçã§ãã
泚ïŒïŒ
ã¯ãã©ãŒãããæååã®ãªãã©ã«æ¬äœã«å
¥ããŸãããã¿ã€ããã€ã³ã¿ãŒã¯ãã®å€åŽã«çãŸããŸãã
ãããã¯ãã¹ãŠãã©ãŒãããæååã®äžéšã§ãã ãã¯ãã¯ãé£æ¥ããæååãªãã©ã«ãšçµã¿åãããæååãªãã©ã«ãšããŠå®çŸ©ãããŸãã
ææ°ã®ã³ã³ãã€ã©ãŒã¯#pragma once
ãµããŒãã#pragma once
ãããããã®ãã£ã¬ã¯ãã£ãã䜿çšããå¿
èŠããããšèšã人ã¯ããŸããã ããã»ããµã®åœä»€ã§ããããã®ãããªæšå¥šäºé
ãå
¬éããŠããŸããã ãŸãããäžåºŠã ãã®èŠåºããã»ã¯ã·ã§ã³ã§ã¯ãïŒpragma onceã«ã€ããŠã®èšèã§ã¯ãããŸããã ãã ãã
#ifndef
説æãããŠããŸãã 次ã®ã»ã¯ã·ã§ã³ã§ã¯ããïŒifndefããã«ãŒã®ä»£æ¿æ¡ãã#pragmaã1åç¹æ»
ãããŸãããããã®å Žåãããã¯ç§»æ€æ§ã®ãããªãã·ã§ã³ã§ã¯ãªãããšã«æ³šæããŠãã ããã
ãã®é¢æ°ã¯ããã¹ãŠã®ã³ã³ãã€ã©ããã³ç°ãªããã©ãããã©ãŒã ã§ãµããŒããããŠãããããããŒã»ãã¥ãªãã£ã³ãŒããæåã§å
¥åãããããã¯ããã«å¹ççãªã¡ã«ããºã ã§ãã
ãããŠã誰ããã®ãããªå§åãããŸããïŒ
#ifndef
ãã£ã¬ã¯ãã£ãã¯çæ³çã§ã¯ãªããããããŸããããä¿¡é Œæ§ãšç§»æ€æ§ããããŸãã
éèŠïŒæ§é ã«å
éšã€ã³ãã³ããããå Žåã{0}ã¡ãœããã¯ãã®ç®çã®ããã«è¿œå ã®ãã€ãããŒãã«ããŸããã ãã®ãããããšãã°ãæ§é ã1ã¯ãŒãåäœã§åãããããããæ§é ç©ã®counter
åŸïŒ64ããããã©ãããã©ãŒã äžïŒã«4ãã€ãã®ã€ã³ãã³ããããå Žåã«çºçããŸãã æªäœ¿çšã®ã€ã³ãã³ããã€ããå«ãæ§é å
šäœãç¡å¹ã«ããå¿
èŠãããå Žåã¯ã memset(&localThing, 0, sizeof(localThing))
æå®ããŸãmemset(&localThing, 0, sizeof(localThing))
sizeof(localThing) == 16 bytes
ã8 + 4 = 12ãã€ããã䜿çšã§ããŸããã
ã¿ã¹ã¯ã¯è€éã«ãªã£ãŠããŸãã éåžžãã€ã³ãã³ããã€ãã«ç¹å¥ãªæ³šæãæãçç±ã¯ãããŸããã 貎éãªæéã圌ãã«æ§ãããå Žåã¯ã
memset
ã䜿çšããŠãªã»ããããŠãã ããã
memset
ã䜿çšããŠæ§é äœãã¯ãªãŒãã³ã°ãããšãèŠçŽ å
šäœã«å®éã«ãŒãã®å€ãå²ãåœãŠãããŠããããšãèæ
®ããŠããæµ®åå°æ°ç¹åãŸãã¯ãã€ã³ã¿ãŒã«å¯ŸããŠåãå¹æãä¿èšŒãããªãããšã«æ³šæããŠãã ãã-ãããã0.0ããã³
NULL
ã§ããå¿
èŠããã
NULL
ïŒãã ãã»ãšãã©ã®ã·ã¹ãã ã§ã¯ãé¢æ°ã¯æ£åžžã«åäœããŸãïŒã
å¯å€é·ã®é
åã¯C99ã§ç»å ŽããŸãã
ããããC99ã¯VLAïŒå¯å€é·é
åïŒã®åæååãæäŸããŸããã ããããå®éãMattã¯VLAã€ãã·ã£ã©ã€ã¶ãŒã«ã€ããŠã¯æžããŠããããVLAèªäœã«ã€ããŠã®ã¿èšåããŠããŸãã
å¯å€é·ã®é
åã¯ççŸããçŸè±¡ã§ãã mallocãšã¯ç°ãªãããªãœãŒã¹å²ãåœãŠã«ãšã©ãŒæ€åºã¯å«ãŸããŸããã ãããã£ãŠãããŒã¿ã®ãã€ãæ°Nãå²ãåœãŠãå¿
èŠãããå Žåã以äžãå¿
èŠã«ãªããŸãã
{ unsigned char *buf = malloc(N); if (buf == NULL) { } free(buf); }
å°ãªããšããæŠããŠã次ã®å Žåãããå®å
šã§ãã
{ unsigned char buf[N]; }
ã¯ããVLAã®äœ¿çšæã®ãšã©ãŒã«ã¯æ·±å»ãªåé¡ã䌎ããŸãã ããããå®éã«ã¯ãã©ã®ããã°ã©ãã³ã°èšèªã®åæ©èœã«ã€ããŠãåãããšãèšããŸãã
ãããŠãåºå®é·ã®å€ãé
åã§ã¯ãåæ§ã®çåãçããŸããã é
åãäœæããåã«ãµã€ãºã確èªããéããå€æ°Nãæã€VLAã¯åããµã€ãºã®åºå®é·é
åãšåããããç¡å®³ã§ãã ååãšããŠãåºå®é·ã®é
åãèšè¿°ããã«ã¯ãå®éã®ããŒã¿ãæ ŒçŽããããã«ãã®äžéšãå¿
èŠãªã®ã§ãäºæ³ãããèŠçŽ ã®æ°ãè¶
ããå€ãéžæãããŸãã VLAã䜿çšãããšãã³ã³ããŒãã³ããå¿
èŠãšããã¹ããŒã¹ãæ£ç¢ºã«å²ãåœãŠãããšãã§ããŸãã ãããŠãããã§ç§ã¯ãããã®æšå¥šã«åæããŸãã
1ã€ã®åŽé¢ã«å ããŠãC11ã§ã¯ãå¿
èŠã«å¿ããŠVLAãéžæã§ããŸãã å®éãã»ãšãã©ã®C11ã³ã³ãã€ã©ãŒã¯ãå°ããªçµã¿èŸŒã¿ã·ã¹ãã ã®å Žåãé€ããå¯å€é·é
åããªãã·ã§ã³ãšããŠèªèããŠãããšã¯æããŸããã ãã ããæãããŒã¿ãã«ãªã³ãŒããäœæããå Žåã¯ããã®æ©èœãèŠããŠããå¿
èŠããããŸãã
é¢æ°ã*ä»»æ**ãœãŒã¹ããŒã¿ããã³ç¹å®ã®é·ãã§æ©èœããå Žåããã®ãã©ã¡ãŒã¿ãŒã®ã¿ã€ããå¶éããªãã§ãã ããã *
ç¥ã£ãŠééãïŒ
void processAddBytesOverflow(uint8_t *bytes, uint32_t len) { for (uint32_t i = 0; i < len; i++) { bytes[0] += bytes[i]; } }
代ããã«äœ¿çšããŸãïŒ
void processAddBytesOverflow(void *input, uint32_t len) { uint8_t *bytes = input; for (uint32_t i = 0; i < len; i++) { bytes[0] += bytes[i]; } }
void*
ãä»»æã®ã¡ã¢ãªã®ãã©ã¡ãŒã¿ãŒãä¿®æ£ããããã®çæ³çãªåã§ããããšã«åæããŸãã å°ãªããšãæšæºã©ã€ãã©ãªã®
mem*
é¢æ°ã䜿çšããŸãïŒãã ããlenã¯
uint32_t
ã§ã¯ãªã
size_t
ã«ããå¿
èŠããã
uint32_t
ïŒã
ãœãŒã¹ããŒã¿åãvoid *ãšããŠå®£èšããé¢æ°æ¬äœã§çŽæ¥å¿
èŠãªå®éã®ããŒã¿åãåå²ãåœãŠãŸãã¯å床åç
§ããããšã«ãããã©ã€ãã©ãªã§äœãèµ·ãã£ãŠããããèããå¿
èŠããªãããããŠãŒã¶ãŒãä¿è·ããŸãã
å°ããªã¡ã¢ïŒããã¯ãMattã®æ©èœã§ã¯è©³ãã説æãããŠããŸããã ããã§ã¯ã
void*
ãã
uint8_t*
ãžã®æé»çãªå€æã確èªããŸãã
ãã®äŸã§ã¯ãäžéšã®èªè
ãã¢ã©ã€ã¡ã³ãã®åé¡ã«çŽé¢ããŠããŸãã
ãããŠã圌ãã¯ééã£ãŠããŸããã ãã€ãã·ãŒã±ã³ã¹ã®ããã«ãç¹å®ã®ã¡ã¢ãªã䜿çšããå Žåãåžžã«å®å
šã§ãã
C99ã¯ãé¢æ°<stdbool.h>
ã»ããå
šäœãæäŸããŸããããã§ã true
ã¯1ã false - 0
ã§ãã
ã¯ãããã ãã
_Bool
çµã¿èŸŒã¿åã®ãšã€ãªã¢ã¹ãšããŠäœ¿çšããã
bool
ãæå®ããããšãã§ããŸãã
æå/倱æã®æ»ãå€ã®å Žåãé¢æ°ã¯true
ãŸãã¯false
ãè¿ãå¿
èŠããããæ»ãå€ã®åint32_t
ãªãã1ãš0ã®æåå
¥åãå¿
èŠãšããŸãïŒããã«æªãããšã«1ãš-1ããããã©ããã£ãŠèª¿ã¹ããïŒ0- success
ãããã³1- failure?
ãŸãã¯0- success
ãããã³-1- failure?
ïŒïŒã
ç¹ã«ãUnixãªã©ã®ã·ã¹ãã ã§ã¯ãæåããå Žåã«é¢æ°ã0ãè¿ãã倱æããå Žåã«ãŒã以å€ã®å€ïŒå€ãã®å Žå-1ïŒãè¿ãåºç¯ãªã¢ã«ãŽãªãºã ããããŸãã å€ãã®å ŽåããŒã以å€ã®å€æ°ã®çµæã¯ããŸããŸãªçš®é¡ã®ãšã©ãŒã瀺ããŸãã æ¢è£œã®ã€ã³ã¿ãŒãã§ãŒã¹ã«æ°ããé¢æ°ãè¿œå ããå Žåãåè¿°ã®æšæºã«åŸãããšãéèŠã§ãïŒäžè¬ã«ãé¢æ°ãå¹æçã«æ©èœããããã®ãªãã·ã§ã³ã¯1ã€ã ããªã®ã§ã0ã¯æåã«çžåœããŸãããå€ãã®ãšã©ãŒãçºçããå¯èœæ§ããããŸãïŒã
ç¹å®ã®æ¡ä»¶ãåæããããã«äœæãããé¢æ°ã¯ã
true
ãŸãã¯
false
ãè¿ãå¿
èŠããã
false
ã ããããæå/倱æããã³ãŒãå®è¡çµæãšæ··åããªãã§ãã ããã
bool
é¢æ°ã«ã¯ãã¢ãµãŒã·ã§ã³ã®åœ¢åŒã§ååãä»ããå¿
èŠããããŸãã è±èªã§ã¯ãã¯ã/ãããã®è³ªåã«çããæèšã«ãªããŸãã ããšãã°ã
is_foo()
ããã³
has_widget()
ç¹å®ã®ã¢ã¯ã·ã§ã³çšã«èšèšãããé¢æ°ã§ãå®è¡ã®æå床ãç¥ãããšãéèŠãªå Žåãããããå¥ã®ã¹ããŒãã¡ã³ãã«ãã£ãŠèšå®ãããŸãã äžéšã®èšèªã§ã¯ãäŸå€ã®è¿œå /æžç®ã«é Œãããšãåççã§ãã Cã§ã¯ãé¢æ°ã®è¯å®çãªçµæã«ãŒãå€ãèšå®ãããªã©ãç¹å®ã®æé»ã®ã«ãŒã«ã«åŸãå¿
èŠããããŸãã
2016幎ã«Cã§éçºããã補åããã©ãŒãããã§ããå¯äžã®è£œåã¯clang-formatã§ãã ãã€ãã£ãã®clang圢åŒã®èšå®ã¯ãä»ã®èªåCã³ãŒããã©ãŒããã¿ãããæ¡éãã«é«ããªã£ãŠããŸãã
ç§èªèº«ã¯clang圢åŒã䜿çšããŠããŸããã ç§ã¯åœŒã«äŒãå¿
èŠããããŸãã
ããããCã³ãŒãã®ãã©ãŒãããã«é¢ããããã€ãã®åºæ¬çãªãã€ã³ããè¡šæããããšæããŸãã
- è¡æ«ã«éãæ¬åŒ§ãå
¥ããŸãã
- ã¿ãã®ä»£ããã«ã¹ããŒã¹ã䜿çšããŸãã
- 1ã¬ãã«ã®4åã
- äžæ¬åŒ§ã¯ãã¹ãŠã§ãïŒåã
ã®å Žåãé€ããèªã¿ããããåäžãããããã«ãã¿ã¹ã¯ãè¡ã«çŽæ¥ãªã¹ãããæ¹ãç°¡åã§ãïŒã
- äœæ¥ããŠãããããžã§ã¯ãã®æ瀺ã«åŸããŸãã
ç§ã¯ãã£ãã«èªåæžåŒèšå®ããŒã«ã«é ŒããŸããã ãã¶ãç¡é§ã§ããïŒ
malloc
䜿çšããªã
calloc
ã
ãã1ã€ãããŸãã å²ãåœãŠãããã¡ã¢ãªã®ãã¹ãŠã®ãããããªã»ããããããšãããšãéåžžã«arbitraryæçãªããã»ã¹ã«ãªããŸããååãšããŠãããã¯è¯ãèãã§ã¯ãããŸããã ã³ãŒããæ£ããèšè¿°ãããŠããå Žåã察å¿ããå€ãæåã«å²ãåœãŠãããšãªãããã®ãªããžã§ã¯ããŸãã¯ãã®ãªããžã§ã¯ããåŒã³åºãããšã¯ã§ããŸããã
calloc
ã䜿çšãããšãã³ãŒãå
ã®ãã°ããŒãã«çãããªããšããäºå®ã«ééããŸããããã¯ãã·ã¹ãã ãšã©ãŒãäžèŠãªããŒã¿ãšæ··åããããããšãæå³ããŸãã ããã¯ã³ãŒãã®æ¹åã®ããã«èãããŸããïŒ
ã¡ã¢ãªããŒãåãããšãå€ãã®å Žåãããã°ã©ã ã³ãŒãã®ãšã©ãŒãé 次ã¢ã«ãŽãªãºã ãå®è¡ããŸãã å®çŸ©ã«ããããããæ£ããèµ·åã³ãŒã¹ãšåŒã¶ããšã¯ã§ããŸããã ãã ããé 次ãšã©ãŒã®è¿œè·¡ã¯ã¯ããã«å°é£ã§ãã
ã¯ããã³ãŒãããšã©ãŒãªãã§äœæãããå Žåã ãã ããã³ãŒããäœæãããšãã«é²åŸ¡æŠç¥ã«åŸãå Žåã¯ã
ç¡å¹ãªã«ããŽãªããç¹å®ã®å€ãå²ãåœãŠãããã¡ã¢ãªã«å²ãåœãŠã䟡å€ããããŸãã
äžæ¹ããã¹ãŠã®ãããããŒãã«ããããšã§èšå®ãããã¿ã¹ã¯ã解決ãããå Žåã¯ã
calloc
ã䜿çšããŠã¿ãŠãã ããã
PS
ãŸããæ¥é±èªè
ãã¬ã€ãä»ããã¢ãŒã§ã¯ã©ãŠãããŒã¿ã»ã³ã¿ãŒã«æåŸ
ããŸãã Habréã®ã€ãã³ãã®ãç¥ããã¯ãã¡ã ã