èšèªæ¡åŒµæ©èœã¯ãæšæºã®äžéšã§ã¯ãªã远å ã®æ©èœããã³èšèªã®æ©èœã§ãããã³ã³ãã€ã©ãŒã«ãã£ãŠãµããŒããããŠããŸãã ãããã®æ¡åŒµæ©èœã®èª¿æ»ã¯éåžžã«è峿·±ãã§ã-äž»ã«ãŒãããçºçãããã®ã§ã¯ãªãããã§ãã åæ¡åŒµæ©èœã¯ã倿°ã®ããã°ã©ããç·æ¥ã«å¿ èŠãªçµæã§ãã ãããŠãç§ã¯äºéã«èå³ããããŸã-ç§ã¯ããã°ã©ãã³ã°èšèªã奜ãã§ãèªåã§éçºããŠãããããå€ãã®å Žåãç§ã®ã¢ã€ãã¢ã®å€ãã¯èšèªæ¡åŒµæ©èœã§å®è£ ãããŠããŸãã Cããã³C ++èšèªæšæºã¯éåžžã«ãã£ãããšéçºãããŠãããæ¡åŒµæ©èœã®èª¬æãèªãã§ããããŒããããã¯æããã§ãïŒ ãªãããããŸã èŠæ Œã«ãªãã®ã§ããïŒã
èšèªæ¡åŒµæ©èœã¯ããã®ãããªãç°è²ãã®åœ±ã®é åã§ãããéåžžã¯ã»ãšãã©èšè¿°ãããã»ãšãã©ç¥èããããŸããã ããããããã¯ãŸãã«åœŒå¥³ãé¢çœããããã®ã§ãïŒ
æ±çšã³ã³ãã€ã©ãŒgccãmsvsãclangãintelãembarcaderoãiarããã³keilãã€ã¯ãã³ã³ãããŒã©ãŒçšã®ã³ã³ãã€ã©ãŒããããŠå¯èœã§ããã°ä»ã®å€ãã®ã³ã³ãã€ã©ãŒãæ€èšããããšãäºåã«èšãããšãã§ããŸãã GCCã®ã»ãšãã©ã®æ¡åŒµæ©èœã¯é©ãããšã§ã¯ãããŸãããç¡æã®éçºã¯ããŸããŸãªèšèªæ©èœã®å®è£ ã«è²¢ç®ããŸãã ããã«ãGCCæ¡åŒµæ©èœã«é¢ããæ å ±ã¯ãã¹ãŠ1ãæã§åéãããä»ã®ã³ã³ãã€ã©ã«é¢ããæ å ±ã¯å°ããã€åéããå¿ èŠããããŸãã ããã§ã¯ãGCCããå§ããŸãããã
Cèšèªæ¡åŒµ
åŒãšããŠã®å¶åŸ¡ã¹ããŒãã¡ã³ããšã³ãŒããããã¯
æãæçœãªã¢ã€ãã¢ã§ãããçŸä»£ã®ãã€ããªããïŒåœä»€æ©èœïŒèšèªã§åãšäž»ã«é©çšãããŸãã ã³ãŒããããã¯ã¯ãåŒã®å€ã§ããå ŽåããããŸãã å€ã¯ããã®ã³ãŒããããã¯ã®æåŸã®åŒã®å€ã§ãã
int q = 100 + ({ int y = foo (); int z; if (y > 0) z = y; else z = - y; z; });
ããŒã«ã«ã¿ã°
gotoæŒç®åã«äœ¿çšãããã©ãã«ã«ã¯ãããã©ã«ãã§æ©èœã«ãã£ãŠå¶éãããã¹ã³ãŒãããããŸãã æã«ã¯-ããšãã°ãã¯ããå±éããå Žå-ããã¯å®å šã§ã¯ãªããã©ãã«ã®ç¯å²ãçŸåšã®ã³ãŒããããã¯ã«å¶éããããšããå§ãããŸãã ãã®ãããªã©ãã«ã«ã¯ã __label__ããŒã¯ãŒãã䜿çšããäºåã®å®£èšãå¿ èŠã§ãã ã©ãã«èªäœã¯éåžžã®æ¹æ³ã§å®£èšãããŸããããã®ã¹ã³ãŒãã¯ãããã¯ã§ããã颿°ã§ã¯ãããŸããã
å€ãšããŠã®ã©ãã«
gotoæŒç®åã«é¢é£ããå¥ã®è峿·±ã匷åãªäœã¬ãã«æ©èœã¯ãå€ãšããŠã©ãã«ã䜿çšããããšã§ãã å®éããã®æ©èœã¯ãã©ãã«ãã³ãŒãå ã®åãªãã¢ãã¬ã¹ã§ããã¢ã»ã³ãã©ãŒã«ãååšããŸãã ããããGCCã¯ç¹å¥ãªã©ãã«ã¿ã€ããæåŠããã©ãã«ãvoid *ã¿ã€ãã«å€æããç®çã§ãäœããã®çç±ã§åé æŒç®å&&ãå°å ¥ãããŸããã ããã¯ãšãŠãçŽ æµã§ããããŒã«èŠããŸãïŒ
static void *array[] = { &&foo, &&bar, &&hack }; goto *array[i];
Dijkstraã®ãã¡ã€ãªã³ã°ã§ã¯ãgotoæŒç®åã¯ã»ãšãã©ã®ããã°ã©ããŒã«å¥œãŸããŸããã å€ãã®å Žåãããã¯æ¬åœã«æ£åœåãããŸãããCãããã«ãŒèšèªã§ããããšãå¿ããªãã§ãã ãããã€ãŸããå¶éãããæ©äŒã奜ããšããã€ããªãã®ãŒãæã£ãŠãããšããããšã§ãã ãŸããç¹å®ã®å ŽæïŒãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã«ãŒãã«ãªã©ïŒã§gotoãå¿ èŠãªå Žåã¯ãã¢ã»ã³ãã©ãæ¿å ¥ãããããgotoã䜿çšããããšããå§ãããŸãã ãããŠãã³ãŒããå°ç¡ãã«ãããå€èªäžèœã«ãããããæ¹æ³ã¯éåžžã«å€ããããŸãããäžã§ãgotoã¯æåããã¯çšé ããã®ã§ãã
å ¥ãå颿°
C ++ã®Lambda颿°ã¯ãC ++ 11ã§ã®ã¿ç»å ŽããŸããã äžæ¹ãTurbo Pascalã§ãã1ã€ã®æ©èœãå¥ã®æ©èœã«æè³ããããšãã§ããŸããã C ++ãšã¯ã©ã¹ã®åºçŸã«ãããäœãå€ãã£ãŠããŸãã-ã¯ã©ã¹ã颿°ãä»ã®ã¯ã©ã¹ã«ãã¹ãããããšã¯ã§ããŸãããã颿°ããã¹ãããããšã¯ãŸã èš±å¯ãããŠããŸããã§ããã GCCã¯èšèªã®ãã®åä»ãªé察称æ§ãä¿®æ£ããŸãã
å ¥ãå颿°ã¯ã倿°ã®åãå ¥ããžã®ã¢ã¯ã»ã¹ããµããŒãããŸãããC ++ã©ã ããšã¯ç°ãªãããã¯ããŒãžã£ãã®æç€ºçãªæç€ºãå¿ èŠãšããŸããããŸããé«ã¬ãã«èšèªã®ã©ã ããšã¯ç°ãªããèªåçã«ãã®ãããªãã¯ããŒãžã£ããç·šæããŸããã å¥ã®è峿·±ãæ©èœã¯ããã¹ãããã颿°ããåã蟌ã¿é¢æ°ã«ç§»åããããšã§ãã ããã¯ãäŸå€ãã¹ããŒããã¿ã€ãã«äŒŒãŠããŸãã
å¯å€æ°ã®åŒæ°ãæã€åŒã³åºããå¥ã®é¢æ°ã«ãªãã€ã¬ã¯ããã
颿°ãžã®å¯å€æ°ã®åŒæ°ãå¯å€æ°ã®åŒæ°ãæã€å¥ã®é¢æ°ã«è»¢éããããã«èšèšãããç¹å¥ãªèšèªæ§æäœãããã³åŒæ°ã®æ°ã«é¢ããæ å ±ã¯å¿ èŠãããŸããã ãåãã®ãšããããã¯ãva_startïŒïŒãva_argïŒïŒãva_endïŒïŒãããã³ã¿ã€ãva_listã¯ãCã§å¯å€æ°ã®åŒæ°ãåŠçããæšæºçãªæ¹æ³ã§ãã ãã®æ¹æ³ã¯ãCã®é¢æ°ã®åŒæ°ãéã®é åºã§ã¹ã¿ãã¯ã«æžã蟌ãŸãããããã®ãã¯ããåã«ã¹ã¿ãã¯ã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ãæäŸãããšããäºå®ã«åºã¥ããŠããŸãã ãããããã®æ¡åŒµæ©èœã§ã¯ãæããã«æ°ããããšãããããŸãã ããã¯äœïŒ
void * __builtin_apply_argsïŒïŒ -颿°ã¯ã¹ã¿ãã¯ã«ã¡ã¢ãªãå²ãåœãŠãåŒã³åºãå ã®é¢æ°ã®åŒæ°ãããã«ã³ããŒããŸãã
void * __builtin_applyïŒvoidïŒ* functionïŒïŒïŒãvoid * argumentsãsize_t sizeïŒ -颿°ã¯__builtin_apply_argsã䜿çšããŠäœæãããããŒã¿ãããã¯ã颿°ãžã®ãã€ã³ã¿ãŒãããã³ãã®ã¹ã¿ãã¯ã®ãµã€ãºãåãå ¥ããŸãã 颿°åŒã³åºãã®å éšã§ã¯ãæž¡ãããåŒæ°ã§åœ¢æãããŸãã 颿°ããè¿ãããæ»ãå€ãæ ŒçŽããã¹ã¿ãã¯äžã®ããŒã¿ãããã¯ãè¿ããŸãã
void __builtin_returnïŒvoid * resultïŒ -颿°ã¯éåžžã®æ»ãå€ã眮ãæãïŒã€ãŸãããã®ãã«ãã€ã³ã®åŸãã³ãŒãã¯å®è¡ãããªããªããŸãïŒãçµæã«ããã¯ããã颿°ã®çµæãè¿ããŸãã
ãããã£ãŠãã¡ã«ããºã ã¯åºæ¬çã«va_listãšã¯ç°ãªããvããŒãžã§ã³ïŒã€ãŸããvprintfãªã©ã®va_listãåãå ¥ããããŒãžã§ã³ïŒãæããªãå¯å€æ°ã®åŒæ°ãæã€é¢æ°ãããå Žåã«é©çšã§ããŸãã
ãã°ããã®éãã€ã³ã©ã€ã³é¢æ°ã§ã®ã¿äœ¿çšããã2ã€ã®çµã¿èŸŒã¿é¢æ°ããããŸãããããã¯åžžã«å³å¯ã«ã€ã³ã©ã€ã³åãããŸãïŒéåžžã®ã€ã³ã©ã€ã³é¢æ°ã®ããã«ã³ã³ãã€ã©ãèšç®ããããã§ã¯ãããŸããïŒã
__builtin_va_arg_packïŒïŒã¯ãååã®ãªãåŒæ°ã®ãªã¹ãå šäœã衚ããŸãã ãã®ãã«ãã€ã³ã¯ãå¯å€é·åŒæ°ãªã¹ãã®ä»£ããã«çŽæ¥äœ¿çšãããŸãã
__builtin_va_arg_pack_lenïŒïŒã¯ãååã®ãªãåŒæ°ã®æ°ãè¿ããŸãã
ã€ã³ã©ã€ã³ãã€ã³ãã£ã³ã°ã®èŠä»¶ããæšæž¬ã§ããããã«ããããã®çµã¿èŸŒã¿é¢æ°ã¯ã³ã³ãã€ã«æ®µéã§ããå€ãåäœããã¹ã¿ãã¯ã§ã®æäœãªã©ã¯ãããŸããã å®è¡æã«å®è¡ãããŸããã
TypeofæŒç®å
ã³ã³ãã€ã«æ®µéã®æŒç®åã¯ãåŒã®ã¿ã€ããè¿ããŸãã åæ§ã®decltypeæŒç®åãC ++ã«ç»å Žããã®ã¯ããã»ã©åã§ã¯ãããŸããã ãã ããC ++ã§ã¯ãªãSIæ¡åŒµæ©èœãæ€èšããŠããããšãæãåºããŠãã ããã ïŒãã¡ãããgcc c ++ã§ãå©çšå¯èœã§ãïŒ
ççž®ãããæ¡ä»¶æŒç®å
åŒïŒ
x ? x : y
以äžã«æžããããšãã§ããŸãã
x ? : y
ããã¯ãç¹ã«xèªäœãé·ãåŒã§ããå Žåã«äŸ¿å©ãªè¡šèšæ³ã§ãã ã¡ãªã¿ã«ããã®åœ¢åŒã¯ãšã«ãã¹æŒç®åãšåŒã°ãã ãšã«ãã¹æŒç®åãæåã®ãªãã©ã³ããããŒã«ã«ãã£ã¹ããããããåœãšæ¯èŒãããšããç¹ã§Null Coalescing_operator ïŒããšãã°CïŒã«ååšïŒãšã¯ç°ãªãã ãã«åäœã¯ãªãã©ã³ããå³å¯ã«ç¹å¥ãªNULLå€ãšæ¯èŒããŸãã
__Int128ããã³long longå
128ãããããã³64ãããæŽæ°ã®ãã1ã€ã®æãããªæ¡åŒµã long longåã¯ãCãšC ++ã®äž¡æ¹ã§æšæºåãããŠããŸããã128ãããæ°ã®æšæºã¯ãŸã ãããŸããã ãããã©ããªãã®ããããããäœãšåŒã°ããã®ã ãããïŒ long long longãšunsigned long long longïŒ
è€éãª
èšèªã¬ãã«ã§ã®ããããã¿ã€ãã®è€çŽ æ°ã®ãµããŒãã ãã®ãããªåãèšèªã«å°å ¥ããããšãçã«ããªã£ãŠãããšã¯æããŸããããããã¯siã§ããããã€ãã£ããªããžã§ã¯ããã³ã³ã¹ãã©ã¯ã¿ãŒããã³ãã¬ãŒããªã©ã¯ãªãããšãæãåºããŠã¿ãŸãããïŒãããå®éã«ã¯ãã³ãã¬ãŒãåã§ãïŒã ãã®èšèªã§ã¯ãæ¥å°ŸèŸ 'i'ããã³ 'j'ïŒããã¯åãããšã§ãïŒã__ real__ããã³__imag__æŒç®åãããã³äžé£ã®è£å©é¢æ°ã®ãµããŒããå°å ¥ãããŸããã
ååã«æ·±ãèšèªãµããŒãã«ãããèšèªã«äœãå«ããã¹ãããèããããšãã§ãããããã³ã³ãã€ã©ãŒã«çŽæ¥åã蟌ãããšãªãããã®ãããªç¹æ®ãªåãå¿«é©ã«å®è£ ããã³äœ¿çšã§ããŸãã
æµ®åå°æ°ç¹åãå粟床
远å ã®æµ®åå°æ°ç¹åïŒ__float80ã__ float128ã__ fp16ã
å®éã IEEE 754æšæºãéããšãããç¥ãããŠããfloatãšdoubleïŒä»ã®èª°ããèŠããŠããå Žåã¯long doubleïŒãããå°ãå€ãã®åãããããšãããããŸãã
10鲿µ®åå°æ°ç¹æ°
æµ®åå°æ°ç¹æ°ã®ãã1ã€ã®è峿·±ã圢åŒã¯ã2ã§ã¯ãªã10ã«åºã¥ããŠããŸãïŒäžèšã®ãªã³ã¯ãåç §ããŠãã ããããããã®åœ¢åŒããããŸãïŒã å Žåã«ãã£ãŠã¯ãå€å žçãªæµ®åå°æ°ç¹æ°ãšå粟床ã¯ãåŠäœã®å éšåºã2ã§ãããæ°å€ã®ããã¹ãã¬ã³ãŒãã10鲿°ïŒã€ãŸã10鲿°ïŒã§ãããšããäºå®ã«é¢é£ããé¢çœããšã©ãŒãäžããããšãæãåºãããŠãã ããã ããšãã°ã0.1 + 0.2ïŒ= 0.3
åºæ°10ã®æµ®åå°æ°ç¹æ°ã¯ã財åèšç®ã§äœ¿çšãããŸãããã®ãããªãšã©ãŒã¯èç©ããããééã®æµåºã«ã€ãªãããŸããã
å è§ãããŒã
ããã¯ã16鲿µ®åå°æ°ç¹æ°ãæžãèŸŒãæ¹æ³ã§ãïŒ10é²è¡šèšã䜿çšãããšãäžéšã®æ°å€ãæ£ç¢ºã«æžã蟌ãããšãã§ããªããšããäºå®ã«ãé¢é£ããŠããŸãïŒã 16鲿°åã«äœ¿çšãããæåãeãã®ä»£ããã«ãæåãpããææ°è¡šèšã«äœ¿çšãããŸãã ãã®çªå·0x12c0a34.f09de78p3ã¯ã©ãã§ããïŒ ç§ã®æèŠã§ã¯ãéåžžã«ããããŒã§ãã
äžåç¹
åºå®å°æ°ç¹æ°ã¯ãGCCã®ãã1ã€ã®äŸ¿å©ãªæ¡åŒµæ©èœã§ãã ãã©ãããã©ãŒã ã«ãã£ãŠã¯FPUããªãå Žåããããåºå®å°æ°ç¹ã®èšç®ãããé«éã§äŸ¿å©ãªå ŽåããããŸãã äœã¬ãã«ã§ã¯ããããã¯éåžžã®æŽæ°ã§ãããã«ããŽãªã®äŸ¡æ Œã¯äžè¬ã«åãå ¥ããããŠãããã®ãšã¯ç°ãªããŸãã çè«çã«ã¯ãæŽæ°éšåãšå°æ°éšåã®ä»»æã®æ¯çã解決ã§ããŸããããGCCã¯_Fractããã³_Accumã¿ã€ãã®ä¿®é£Ÿåã«å®è£ ãããã¡ã€ã³ã¯ãŒããµã€ãºïŒ2ã4ãããã³8ãã€ãïŒã«ç¹å®ã®æ¯çãæ¡çšããŸããã ããã«ãäœããã®çç±ã§ãã®æ©èœããã¹ãŠã®ã³ã³ãã€ã©ã«å«ãŸããŠããããã§ã¯ãªããããå®éã«ãã®æ©èœãæ€èšŒããããšã¯ã§ããŸããã§ããã
å¥ã®_Sat修食åã¯é£œåã®èšç®ã«äœ¿çšãããŸã-ããã¯åŠçãªãŒããŒãããŒã®ç¹å¥ãªã¢ãŒãã§ãèšç®çµæãç¹å®ã®åã®ç¯å²ã«åãŸããªãå Žåããã®åã§å¯èœãªæå€§å€ãŸãã¯æå°å€ã倿°ã«ä¿åãããŸãã 粟床ã¯å€±ãããŸãããèšå·ãä»ããé·ç§»ã¯ãªããããå Žåã«ãã£ãŠã¯æãŸããå ŽåããããŸãïŒè²ãé³ãªã©ã®åŠçïŒ
ååä»ãã¢ãã¬ã¹ã¹ããŒã¹
è€æ°ã®ã¢ãã¬ã¹ç©ºéãæã€ã¢ãŒããã¯ãã£ã«ãšã£ãŠéåžžã«äŸ¿å©ã§ãã ããšãã°ãç°ãªããã€ã¯ãã³ã³ãããŒã©ãŒçšã RAMããã©ãã·ã¥ãeepromãããããã¹ãŠãããã€ãã®ãã³ã¯ã«ãããŸãã ãããŠãã¢ãã¬ã¹ç©ºéããšã®ç¬ç«ããã¢ãã¬ã¹æå®ã·ã¹ãã ã
é·ãããŒãã®é å
æ§é ãå¯å€é·ãªããžã§ã¯ãã®ããããŒã§ããå ŽåãæåŸã®èŠçŽ ãšããŠæ§é ã§äœ¿çšãããŸãã äœã¬ãã«ã®ã³ãŒãã«ã¯éåžžã«äŸ¿å©ã§ãã ãããã®å ŽåãïŒä»ã®ã³ã³ãã€ã©ã§ïŒæ¡åŒµæ©èœãå©çšã§ããªãå Žåã1ã€ã®èŠçŽ ã®é åãäœæããå¿ èŠããããŸãããããã¯äžè¬ã«æ£ãããããŸããããªããžã§ã¯ãã®å¯å€é·ã¯ãŒããããããŸããã ãŸããäœåãªãµã€ãºã¯äžå¿ èŠãªã¡ã¢ãªå²ãåœãŠãªã©ã«ã€ãªããå¯èœæ§ããããŸãã
ç©ºã®æ§é
ãã®ãããªæ§é ãå ¬åŒã«èš±å¯ãããŠããC ++ãšã¯ç°ãªããCã§ã¯æ¡åŒµæ©èœã§ãã ãŸããCã§ã¯ãäœããã®çç±ã§1ãã€ãã§ããC ++ãšã¯ç°ãªãããµã€ãºïŒsizeofïŒã¯å®éã«ã¯ãŒãã§ãã
å®è¡æã«æ±ºå®ãããé å
æãããªããšã ã¹ã¿ãã¯äžã®ã¡ã¢ãªãå²ãåœãŠã颿°allocaïŒïŒããããŸãã 圌女ãè§£æŸããå¿ èŠã¯ãããŸããã GCCã¯ãèšèªã¬ãã«ã§ãã®æ¹æ³ã§é åã宣èšããæ©èœã远å ããŸãã
void foo(int n) { int arr[n]; }
ããã«ãGCCã§ã¯ãå¯å€é·é åãã£ãŒã«ããæã€ãã¹ããããæ§é ã宣èšã§ããŸãïŒ
void foo (int n) { struct S { int x[n]; }; }
ãŸããå¯å€é·é åã䜿çšãã颿°ïŒé·ãã¯é¢æ°ã®åŒæ°ãªã¹ãã«ç€ºãããŠããŸãïŒïŒ
void foo(int len, char data[len][len]) { /* ... */ }
ãããŠãé åã®åŸã«é·ããæå®ãããå Žåãããã¯å¯èœã§ãïŒ GCCã¯ã颿°åŒæ°ã®ãªã¹ãã«äºå倿°å®£èšçšã®ç¹å¥ãªæ§æãå°å ¥ããŠããŸããããã¯ãä»ã®å€ãã®ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéåžžã«è峿·±ãæ¹æ³ã§ãïŒãã ããããã¯å¥ã®ãããã¯ã§ãïŒã
void foo (int len; char data[len][len], int len) { /* ... */ }
å¯å€åŒæ°ãã¯ã
ãã®ãããªãã¯ãã¯ãæšæºã®C99ããã³C ++ 11ã§ç»å ŽããŸããã ãããã¯ä»¥åã«GCCã«ç»å ŽããŸããã æšæºããŒãžã§ã³ã«é¢é£ããŠãããã€ãã®æ¹åããµããŒããããŠããŸãã å®éãå¯å€æ°ã®ãã©ã¡ãŒã¿ãŒãæã€ãã¯ãã¯ãå¯å€æ°ã®åŒæ°ããã¯ãã«æž¡ãããããã®åŒæ°ã®ããã±ãŒãžãåäžã®ãŠããããšããŠäœ¿çšããŠãå¯å€æ°ã®åŒæ°ããµããŒãããä»ã®èšèªãšã³ãã£ãã£ïŒé¢æ°ãä»ã®ãã¯ããC ++ãã³ãã¬ãŒãïŒã ãã¯ã宣èšã§ã¯ãåŒæ°ã®ããã±ãŒãžã¯3ã€ã®ãããã...ããšããŠæå®ãããæ¬äœã§ã¯èå¥å__VA_ARGS__ãšããŠæå®ãããŸã ã
æ¡åŒµæ©èœã«ã€ããŠèª¬æããŸãã ãŸãã3ã€ã®ãã€ã³ããš__VA_ARGS__ã®ä»£ããã«ã3ã€ã®ãã€ã³ãã§å®£èšãããŠãããããããªãã§äœ¿çšãããéåžžã®ååã䜿çšã§ããŸãã ããã«ãããã³ãŒãã®å¯èªæ§ãåäžããäžè¬çã«ããèªäœãéåžžã«çŸããã¢ã€ãã¢ã«ãªããŸãã
#define LOG(args...) fprintf (stderr, args)
2çªç®ã¯ããæåŸã®ã³ã³ããã䜿çšããæ£ããäœæ¥ã§ãã ã³ãŒãçæïŒããã³ãã¯ãã¯ã³ãŒãçæã§ããããŸãïŒã§ã¯ããªããžã§ã¯ãã®ãªã¹ãã®æåŸã«ã³ã³ãã衚瀺ããããšãå¿ ç¶çã«ç¶æ³ãçºçããŸãã ç¥çèšèªã§ã¯ãããã°ã©ãã³ã°èšèªã¯ãã®ç¶æ³ãæ£åžžãšèŠãªãã¹ãã§ãããæ®å¿µãªããã»ãšãã©ã®èšèªïŒCãå«ãïŒã¯ããããšã©ãŒãšèŠãªããŸãã ãããã£ãŠãæŸèæãçºæãããŸãã-ç¹å¥ãªæ§æ## __ VA_ARGS__ãåŒæ°ã®ããã±ãŒãžã空ã®å Žåã«ã³ã³ããåé€ããŸãã
ããªããã»ããµã§æååãã©ããããããã®è»œéã«ãŒã«
ããªããã»ããµèªäœã¯éåžžã«ãå±éºãªãã®ã§ãïŒããŸããŸãªèšäºãžã®ã³ã¡ã³ãã§å®æçã«èšåããŠããŸãïŒã ãããããããã§ããããããã€ãã®å³ããèŠä»¶ãç·©åããããšã¯éåžžã«è«ççã§ãã ç¹ã«ãCããªããã»ããµã¯éåžžã«å¥åŠã§æããªããã¯ã¹ã©ãã·ã¥æ§æã䜿çšããŠè€æ°è¡ãã¯ããå®è£ ããŸãã ãã®æ¡åŒµæ©èœã䜿çšãããšãããã¯ã¹ã©ãã·ã¥ã®åŸã«ç©ºçœæåãå«ããããšãã§ããŸãïŒæåã¯è¡šç€ºãããªããããã³ãŒãã®ç·šéäžã«èª€ã£ãŠå ¥åããŠãæ°ã¥ããªãå ŽåããããŸãïŒã
é巊蟺å€é åã®ã€ã³ããã¯ã¹ä»ã
ä»ã§ã¯æãããªããã«èŠããŸãããC90ã§ã¯äœããã®çç±ã§é巊蟺å€é åã«ã€ã³ããã¯ã¹ãä»ããããšãã§ããŸããã§ããã 幞ããªããšã«ãããã¯C99ãšC ++ã®äž¡æ¹ã§å¯èœã§ãã
void *ãã€ã³ã¿ãŒãšé¢æ°ãã€ã³ã¿ãŒã䜿çšããç®è¡æŒç®
ãã®ãããªãã€ã³ã¿ãŒã§ã®ç®è¡æŒç®ã¯èš±å¯ãããŠããŸãã ã¢ãã¬ã¹æå®ããããªããžã§ã¯ãã®ãµã€ãºã¯1ãã€ãã§ãããšæ³å®ãããŸãïŒãã ããããã¯å¥åŠãªçµæãæå³ããŸãïŒsizeofïŒvoidïŒãšæ©èœã¿ã€ãã®sizeofã¯1 ...ããã¯è¯ããããŸããïŒã
修食åãæã€é åãžã®ãã€ã³ã¿ãŒ
GCC Cã®ä¿®é£ŸåïŒconstããã³ãã®ä»ïŒãæã€é åãžã®ãã€ã³ã¿ãŒã䜿çšããäœæ¥ãå®è£ ããããã®æšæºãšã®åŸ®åŠãªéã
é宿°ã®åæåå
æãããªããšã§ãããæšæºã§ã¯ãé宿°ãªããžã§ã¯ããåæåãªã¹ãïŒäžæ¬åŒ§ïŒã§äœ¿çšããããšã¯ã§ããŸããã ãã®æ¡åŒµæ©èœã¯ãã®æ©äŒãéããŸãïŒ
foo (float f, float g) { float beat_freqs[2] = { fg, f+g }; /* ... */ }
è€åãªãã©ã«
誰ããããŸããŸãªè§åºŠããã¢ãããŒãããŸãããå®å šã«ãåæ¶äžèœãã€æ£ç¢ºã«ãããå®çŸããããšã¯ã§ããŸããïŒãããæãéèŠã§ãïŒã é åã颿°ãããã³å ±çšäœã®ãªããžã§ã¯ããšããŠäœ¿çšã§ããè€åãªãã©ã«-åæåã ãã§ãªããåã«ã³ãŒãã§ã-å²ãåœãŠã颿°ãžã®åŒæ°ãšããŠæž¡ãããã
obj = ((struct foo) {x + y, 'a', 0}); char **tbl = (char *[]) { "x", "y", "z" };
ãã®ãããªãªãã©ã«ã®å Žåã察å¿ããã¿ã€ãã®äžæãªããžã§ã¯ããäœæãããåŒã«åå ããŸãã ãããã£ãŠãããšãã°ãããã¯å¯èœã§ãïŒå®æ°ã¯å·ŠèŸºå€ã§ã¯ãªããããäžå¯èœã«æããŸãïŒã
int i = ++(int) { 1 };
åæåãªã¹ãã®æå®ãããèŠçŽ
åæåãªã¹ãã®ãã1ã€ã®çŸããæ¡åŒµæ©èœ-ãªã¹ãå ã§ã¯ãè¡å ã®ãã¹ãŠã®èŠçŽ ã ãã§ãªããèšè¿°åã®æ§æã䜿çšããŠç¹å®ã®èŠçŽ ãæå®ã§ããŸãã é åã®å Žåããããã¯èŠçŽ ã€ã³ããã¯ã¹ã瀺ãããŠããåé è§æ¬åŒ§ã§ãã ã ãã
int a[6] = { [4] = 29, [2] = 15 };
ãšåçïŒ
int a[6] = { 0, 0, 15, 0, 29, 0 };
ç¯å²ã䜿çšã§ããŸãïŒ
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
æ§é ã®å Žåãåé ãããã䜿çšããåæ§ã®æ§æã䜿çšãããŸãã
struct point p = { .y = yvalue, .x = xvalue };
äž¡æ¹ã®ã¿ã€ãã®æå®åãæ··åšãããããšãã§ããäž¡æ¹ã®æå®åãšåãåæåãªã¹ãå ã®èŠçŽ ã®ã¿ã䜿çšã§ããŸãã
struct point ptarray[10] = { [2].y = yv2, {33,44}, [2].x = xv2, [0].x = xv0 };
ãšããã§ããã®æ¡åŒµæ©èœã¯C ++ã§å®è£ ãããŠããããæšæºã«ãã©ãã°ãããŠããŸããã æ®å¿µãªããšã«ãããã¯æãçŸããæ¡åŒµæ©èœã®1ã€ã§ãããC ++ã§ã¯ãªãCã«ãããã®ã®1ã€ã§ãã
ã±ãŒã¹ã®ç¯å²
caseã¹ããŒãã¡ã³ããšããŠswitchã¹ããŒãã¡ã³ãã§ç¯å²ïŒçç¥èšå·ä»ãïŒã䜿çšããæ©èœïŒ
switch(c) { case 'A' ... 'Z': /* ... */ break; }
ãããããã§ãããGCCã®èè ã¯ãçç¥èšå·ãã¹ããŒã¹ã§å²ãããšããå§ãããŸããããããªããšãæŽæ°ã®è§£æã«åé¡ãããå¯èœæ§ããããŸãïŒãããããæ°å€ã宿°ãšããŠèªèãããããšãæããŠããŸãïŒã é©åãªè§£æã§ã¯ãããã¯ãã¹ãã§ã¯ãªããåãæåã§å§ãŸãçãæŒç®åãããé·ãæŒç®åãåªå ãããã¹ãã§ãã ãŸãã
ãŠããªã³ã®ã¡ã³ããŒã§ãããªããžã§ã¯ãããŠããªã³åã«å€æãã
çµåãããå ŽåïŒ
union foo { int i; double d; };
intããã³doubleãªããžã§ã¯ãã®åãæç€ºçã«åfooã«ãã£ã¹ãã§ããŸãã
union foo u; int x; double y; u = (union foo) x; u = (union foo) y;
åæ§ã«ãåŒæ°ã颿°ã«æž¡ãå ŽåïŒ
void hack (union foo); hack ((union foo) x);
倿°å®£èšãšã³ãŒãã®æ··å
C90ã®C ++ã§ããç¥ãããŠãããã®ãæ¡åŒµæ©èœã§ãïŒC99ã§ã¯æšæºã«å«ãŸããŠããŸããïŒã
颿°ã倿°ãåãã©ãã«ãåæãå¶åŸ¡æŒç®åã®å±æ§
ç¹å¥ãªããŒã¯ãŒã__attribute__ ãããã«ãããã³ã³ãã€ã©ãŒå®çŸ©ã®å±æ§ïŒã¡ã¿æ å ±ïŒãããŸããŸãªèšèªæ§æèŠçŽ ã«å²ãåœãŠãããšãã§ããŸãã ããŒã¯ãŒãã®åŸã«ââã屿§åãæ¬åŒ§ã§ç€ºãããŠããŸãã 屿§ã¯å€§ããç°ãªãå ŽåããããŸãã äžéšã®å±æ§ã¯äžè¬çã§ãããä»ã®å±æ§ã¯ç¹å®ã®ã¢ãŒããã¯ãã£ã«åºæã®ãã®ã§ãã 屿§ã«ã¯ã屿§åã®åŸã«ãã£ãã§å²ãŸããåŒæ°ãå«ããããšãã§ããŸãã ããã«ããã€ãã®å±æ§ããããŸãïŒå®éãå€ãã®å±æ§ããããããããããã®ãããã¯ã¯å¥ã®èšäºã«å€ããŸãïŒã
æ©èœå±æ§ïŒ
noreturnã-颿°ã¯å¶åŸ¡ãè¿ããŸããã
pure-å¯äœçšã®ãªã颿°ïŒå€ã¯åŒæ°ã®ã¿ã«äŸåããŸãïŒã
format-åœ¢åŒæååprintfã®ã¹ã¿ã€ã«ã®åŒæ°ããããŸãã
ã©ãã«å±æ§ïŒ
æªäœ¿çš-ã©ãã«ã¯gotoã§ã®ããã²ãŒãã«äœ¿çšãããŸããã
ããã-ã¿ã°ä»ãã®å¯èœæ§ãé«ã
ã³ãŒã«ã-ã¿ã°ä»ãã®ç¢ºçã¯äœã
åæèŠçŽ ã®å±æ§
éæšå¥š-èŠçŽ ã®äœ¿çšã¯æšå¥šãããŠããŸãããã³ãŒãã§äœ¿çšãããå ŽåãèŠåã衚瀺ãããŸã
æŒç®åã®å±æ§
fallthrough-switch / caseã¹ããŒãã¡ã³ãã§äœ¿çšãããbreakã®ä»£ããã«èšå®ããŠãæå³çã«ãã¬ãŒã¯ããªãããšãã³ã³ãã€ã©ã«ç€ºããŸãã
å¯å€å±æ§
æŽåïŒNïŒ-æå®
å€ãã¹ã¿ã€ã«ã®é¢æ°å®çŸ©ã§ãããã¿ã€ãã宣èšãã
å€ãCãšã®äºææ§ã®æŸèæãããã«ãããæ°ããã¹ã¿ã€ã«ã§é¢æ°ã®ãããã¿ã€ãã宣èšã§ããŸããã颿°ã®æ¬äœã¯å€ãã¹ã¿ã€ã«ã§å®çŸ©ãããŸãïŒåã®ãªãæ¬åŒ§å ã®åŒæ°ãåã§åŒæ°ãåé¢ããäžæ¬åŒ§ã§æ¬äœãåé¢ïŒã
C ++ã¹ã¿ã€ã«ã®ã³ã¡ã³ã
ããªãã¯ãããä¿¡ããªãã§ãããããäžè¬çã«èšãã°ãããã¯æ¡åŒµæ©èœã§ããããŸã-åäžè¡ã³ã¡ã³ãããŸã Cæšæºã«å«ãŸããŠããªãã£ãå€ä»£ããæ®ããããã®ã§ãã ã¯ããããããæããããŸããã
èå¥åã®ãã«èšå·
ãããçã«ããªã£ãŠãããã©ããã¯ããããŸãããïŒæŒç®åèšå·ã¯ã»ãšãã©ãããŸããïŒããã®ããã«-æåãæ°åãã¢ã³ããŒã¹ã³ã¢ãšãšãã«èå¥åã«ãã«èšå·ã䜿çšã§ããŸãã
ãšã¹ã±ãŒãèšå·
æååãŸãã¯æåãªãã©ã«ã§ã\ eãã䜿çšããŠãæåãæ¿å ¥ããŸãã æåã¯ããŒã¿ãã«æåã»ããã«å«ãŸããŠããŸããããPOSIXã«ãªã¹ããããŠããªãä»ã®å¶åŸ¡æåãããé »ç¹ã«å¿ èŠã«ãªãããã§ãã
åãŸãã¯å€æ°ãã£ãŒã«ãã®ã¢ã©ã€ã¡ã³ãã®ã¯ãšãª
__alignof__ããŒã¯ãŒãã¯ãããã¿ã€ãã®ãã£ãŒã«ããŸãã¯ããã¿ã€ãã®ãã£ãŒã«ãã«å¿ èŠãªã¢ã©ã€ã¡ã³ããè¿ããŸãã ã¢ã©ã€ã¡ã³ã1-ãã€ãå¢çã«æ²¿ã£ãïŒå¯èœãªéãæå°ïŒã2-ã¯ãŒãå¢çã«æ²¿ã£ãã4-ããã«ã¯ãŒãå¢çã«æ²¿ã£ãããªã©
ã€ã³ã©ã€ã³é¢æ°
ããã¯ãCã«ç§»æ€ãããC ++ã®ããç¥ãããæ©èœã§ãã
volatileã䜿çšãã
GCCã§volatileã䜿çšããããã€ãã®æ©èœã 奜å¥å¿ãã-ã³ãŒãã«ãããå«ãŸããŠããå ŽåïŒ
volatile int *ptr; /*...*/ *ptr;
GCCã¯ããããptrãæãã¡ã¢ãªããã®èªã¿åããšããŠè§£éããé©åãªã³ãŒããçæããŸã
ã¢ã»ã³ããªæ¿å ¥ç©ã®äœ¿çš
GCCã§ã®ã¢ã»ã³ãã©ãŒã€ã³ãµãŒãã®äœ¿çšãæ€èšãç§ãç¥ã£ãŠããéããã¢ã»ã³ãã©ãŒæ¿å ¥ã®ãããã¯èªäœã¯æšæºã®äžéšã§ã¯ãªããããã§èª¬æããã®ã«ååãªã»ã©åºç¯ã§ããã¢ã»ã³ãã©ãŒã®æ¿å ¥ã¯ãäžè¬ã«å¥ã®èšèªã®æ¿å ¥ã®ç¹æ®ãªã±ãŒã¹ã§ãããšèšããªããã°ãªããŸããã2ã€ã®æ§æã®äº€ç¹ã§ãããå Žåã«ãã£ãŠã¯äºææ§ããªãããšããããŸããã©ããããã®çç±ã§ãGCCã¢ã»ã³ãã©ãŒã®æ¿å ¥ã¯æååã®ãããªåŒçšç¬Šã§å²ãŸããŠããŸãã
ããããŒãã¡ã€ã«ã®ä»£æ¿ããŒã¯ãŒã
å¥ã®èŠæ Œãšã®äºææ§ã®ããæŸèæã®ãããªãã®ã__const __ã__ asm__ãªã©ã®åèª
äžå®å šãªè»¢é
èŠçŽ ãªãã§enumã宣èšã§ããŸãããã®ã¿ã€ãã®å€æ°ã¯å®£èšã§ããŸãããããã®ãããªåæãžã®ãã€ã³ã¿ãŒã¯å®£èšã§ããŸããæ§é ããã³é¢é£ä»ããšã®é¡æšã«ããããªã¹ãã®ååã®äºå宣èšã®å¯èœæ§ã®ããã«äœæãããŸããã
æååãšããŠã®é¢æ°å
ãããã¯Cã§ã®åå°ã®åºç€ã§ããèå¥å__FUNCTION__ïŒãŸãã¯__func__ïŒããã³__PRETTY_FUNCTION__ã«ã¯ããããã䜿çšããã颿°ã®ååãå«ãŸããŠããŸãã__PRETTY_FUNCTION__ã«ã¯ãæ¡åŒµåïŒçœ²åïŒãå«ãŸããŸãã
åŒã³åºã颿°ã®ã¢ãã¬ã¹ãšã¹ã¿ãã¯ãã¬ãŒã ã®ååŸ
颿°åŒã³åºãã¹ã¿ãã¯ãžã®ã¢ã¯ã»ã¹ãå®è£ ããŸããç¹å¥ãªçµã¿èŸŒã¿é¢æ°ïŒçµã¿èŸŒã¿ïŒã䜿çšããŠãç®çã®ã¬ãã«ïŒåŒã³åºãåŽé¢æ°ãåŒã³åºãåŽãåŒã³åºãã颿°ãªã©ïŒã®æ»ãã¢ãã¬ã¹ãããã³é¢æ°ãšãã¹ãŠã®åŒã³åºãåŽé¢æ°ã®ã¹ã¿ãã¯ãã¬ãŒã ã®ã¢ãã¬ã¹ãååŸããŸãã
ãã¯ãã«åœä»€ã®æ¡åŒµ
å€ãã®ããã»ããµã¯ããã¯ã¿ãŒããŒã¿ã¿ã€ããšåœä»€ããµããŒãããŠããŸãïŒããšãã°ãSIMD-åäžåœä»€ãè€æ°ããŒã¿ïŒã
ãã®æ¡åŒµæ©èœã¯ãvectoråã®å®£èšïŒvector_size屿§ã䜿çšïŒãšããããã®åã«å¯Ÿããéåžžã®æäœã®äœ¿çšããµããŒãããŸããåã¯åºæ¬çã«é åã§ããããã®æäœã¯éåžžã®å€æ°ã®æäœã«äŒŒãŠããŸãããã ããé åã®ããã«ã€ã³ããã¯ã¹ãäœæã§ããŸãã
typedef int v4si __attribute__ ((vector_size (16))); v4si a = {1,2,3,4}; v4si b = {3,2,1,4}; v4si c; a = b + 1; // a = b + {1,1,1,1}; a = 2 * b; // a = {2,2,2,2} * b; c = a > b; // c = {0, 0,-1, 0} c = a == b; // c = {0,-1, 0,-1}
ç¹å¥ãªçµã¿èŸŒã¿é¢æ°__builtin_shuffleã¯ããã¯ãã«å ã®èŠçŽ ãåé 眮ããããã€ã³ããã¯ã¹ãã¹ã¯ã«åŸã£ãŠ2ã€ãã1ã€ã®ãã¯ãã«ã圢æããããã«ã䜿çšã§ããŸãã
v4si a = {1,2,3,4}; v4si b = {5,6,7,8}; v4si mask1 = {0,1,1,3}; v4si mask2 = {0,4,2,5}; v4si res; res = __builtin_shuffle (a, mask1); /* res is {1,2,2,4} */ res = __builtin_shuffle (a, b, mask2); /* res is {1,5,3,6} */
offsetofã®ç¹å¥ãªæ§æ
æ§é äœã®å é ããã®ãã€ãåäœã®ãã£ãŒã«ããªãã»ãããè¿ãoffsetofæŒç®åã¯ã次ã®åœ¢åŒã®ãã¯ãã§å®è£ ã§ããŸãã
offsetof(s, m) (size_t)&(((s *)0)-âºm)
ãã ããããã¯Cæšæºã§ã¯æªå®çŸ©ã®åäœã§ããïŒãŒãåç §è§£é€ã®ããïŒãããŸããŸãªäžèŠãªã³ã³ãã€ã©èŠåãçºçããŸãããããã£ãŠãçµã¿èŸŒã¿é¢æ°__builtin_offsetofã䜿çšããŠoffsetofãå®è£ ããŸã
ããŸããŸãªçµã¿èŸŒã¿é¢æ°ïŒbuiltinsïŒ
ãã®æŠå¿µãç¬ç«ãããšã³ãã£ãã£ãšããŠç®ç«ã€ããšã¯ãã£ãã«ãããŸããããç¡é§ã§ããçµã¿èŸŒã¿é¢æ°ã¯ãèšèªããŒã¯ãŒããšéåžžã®é¢æ°ã®äžéã§ãããã©ãã§ã䜿çšãããŸããã»ãšãã©ã®ããã°ã©ããŒã¯ããã®æ§è³ªã«ã€ããŠãèããŠããŸããã
ããšãã°ããµã€ã³ãµã€ã³ïŒïŒãèŠèŠçã«ã¯ããã®é¢æ°ã¯é¢æ°ã®ããã«åäœããŸãïŒã¢ãã¬ã¹ãååŸããããšãã§ããŸãïŒããã ããã³ã³ãã€ã©ã¬ãã«ã§ã¯ããã®ã³ã³ã¹ãã©ã¯ãã¯é¢æ°åŒã³åºãã§ã¯ãªã1ã€ä»¥äžã®ã¢ã»ã³ãã©ãŒFPUåœä»€ã«å€æãããŸãïŒæµ®åå°æ°ç¹ããµããŒãããªãã¢ãŒããã¯ãã£ã®FPUãšãã¥ã¬ãŒã·ã§ã³ã®å Žåãé€ãïŒ ïŒãã®ãããªé¢æ°ã¯çµã¿èŸŒã¿é¢æ°ãšåŒã°ããã³ã³ãã€ã©ãŒã«ãã£ãŠçŽæ¥çæãããŸããããã«ãããã©ã€ãã©ãªãŒé¢æ°ã§ã¯å©çšã§ããªãæ©èœãå®è£ ã§ããŸãããããã«ã¯ãã¢ãããã¯ã¡ã¢ãªã¢ã¯ã»ã¹ãç®è¡ãªãŒããŒãããŒã®ãã§ãã¯ãCilk Plusæ¡åŒµãæ°åŠé¢æ°ãç¹å®ã®ãã©ãããã©ãŒã ãããã»ããµãæäœããããã®å€ãã®é¢æ°ãªã©ãå«ãŸããŸãã
ãã©ã°ã
ãã©ã°ãã¯ãäžè¬çãªå Žåã«ãœãŒã¹ããçŽæ¥ã³ã³ãã€ã«ããã»ã¹ã现ããå¶åŸ¡ããããã®ãã£ã¬ã¯ãã£ãã§ããããªããã»ããµãšèšèªèªäœã®äž¡æ¹ã«èµ·å ããå¯èœæ§ããããŸãïŒå®éãã©ããã«æç¢ºã«åž°å±ãããããšã¯é£ãããããªããã»ããµã¯é·ãéèšèªã«çµ±åãããŠããŸãïŒãGCCã¯ãæ±çšãã©ã°ããšãã©ãããã©ãŒã åºæãã©ã°ãã®äž¡æ¹ããµããŒãããŠããŸãããã®ãããã¯ã¯å€§ãããŠè峿·±ããã®ã§ãããçµã¿èŸŒã¿ã®ãã®ã§ãããããå¥ã®ããŒãã§èª¬æããããšãã§ããŸãã
æ§é ãšé¢é£ä»ãã®ååã®ãªããã£ãŒã«ã
æ§é ãšé¢é£ä»ãã§ã¯ããã¹ããããååã®ãªãæ§é ãšé¢é£ä»ãã宣èšã§ããŸãããããã®ãã¹ããããæ§é ãšé¢é£ä»ãã®ãã£ãŒã«ãã¯ãçŽæ¥å©çšã§ããŸãã
struct { int a; union { int b; float c; }; int d; } foo; foo.b = 10;
ããã¯ãæ§é ã«ååããªãå Žåã«ã®ã¿æ©èœããããšã«æ³šæããŠãã ãããååãä»ããŠããã®ãããªã¢ããŠã³ã¹ã¡ã³ããå æ¬çãªããŒã ã¹ããŒã¹å ã®ãã¹ããããæ§é ã®å®£èšã«å€ããå Žåãã€ãŸãããã¹ãããžãã¯ã¯ããŒã¿ã®ãã¹ãããããŒã ã¹ããŒã¹ã®ãã¹ãã«å€ãããŸãã
ãŸããã³ã³ãã€ã©ãªãã·ã§ã³ã§Plan9æ¡åŒµã¢ãŒãïŒ "-fplan9-extensions"ïŒãæå¹ã«ãããšãGoã§ã®ã¿äœ¿çšã§ããæ©èœãå®è¡ã§ããŸããããã€ãã®æ§é ãä»ã®æ§é ã«åã蟌ãããšãã§ããŸããæ§é äœãã£ãŒã«ãã§ã¯ãå¥ã®æ§é äœã®ãã£ãŒã«ãå šäœãåã蟌ã¿ãç¬èªã®æ§é äœãã£ãŒã«ããšããŠåç §ã§ããŸããC++ç¶æ¿ãšã¯ç°ãªãããã£ãŒã«ããåã蟌ãå Žæãæ£ç¢ºã«æå®ã§ããŸãïŒäœã¬ãã«ã®ç®çã«ãšã£ãŠéèŠã§ãïŒã
typedef struct { int a; } s1; // typedef' typedef struct { int x; s1; int y; } s2; s2 obj; obj.a = 10; //
ã¹ã¬ããããŒã«ã«å€æ°
åºæ¬çã«ãã¹ã¬ããããŒã«ã«ã¹ãã¬ãŒãžã®ã¹ã¬ããã¡ã¢ãªé åã«æ ŒçŽãããéçã¹ã¬ãã倿°ãã¹ããªãŒã ãTLSãªã©ãååšããå Žåã¯ãããã«å€æ°ã宣èšããããã®ããŒã¯ãŒããå¿ èŠã§ãã
ãã€ããªãªãã©ã«
70幎代ã«Cèšèªãšãšãã«ç»å Žããã¯ãã ã£ãæãåçŽã§æãæçœãªãã®ã®1ã€ããããã衚瀺ãããŸããã§ããã宿°ã«ã¯ãæ¥é èŸã0bãã䜿çšãããŸãã
å ¬åŒã®æ¹æ³ããããŸããã8é²å®æ°ã®å Žåãæ¥é èŸã0oããå ¥åãã䟡å€ãããããšã«æ³šæããŠãã ãããå è¡ãŒãã®æžã蟌ã¿ã¡ãœããã¯ã²ã©ãã§ãã
GCC C ++æ¡åŒµæ©èœ
volatileã䜿çšãã
GCC C ++ã§volatileã䜿çšããããã€ãã®æ©èœãCãšã®éã
å¶éä»ããã€ã³ã¿ãŒïŒC99ããïŒ
restrictããŒã¯ãŒãã䜿çšãããšãããã°ã©ãã¯ã宣èšããããã€ã³ã¿ãŒãä»ã®ãã€ã³ã¿ãŒãæã瀺ããŠããªãã¡ã¢ãªãŒã®ãããã¯ãæããŠããããšãã³ã³ãã€ã©ãŒã«äŒããããšãã§ããŸããè€æ°ã®ãã€ã³ã¿ãŒã1ã€ã®ã¡ã¢ãªãããã¯ãæããªããšããä¿èšŒã¯ãããã°ã©ããŒã«ãã£ãŠäžããããŸããåæã«ãæé©åã³ã³ãã€ã©ã¯ããå¹ççãªã³ãŒããçæã§ããŸãã
GCCæ¡åŒµæ©èœã§ã¯ãå¶éãªã³ã¯ãäœæããŠthisãã€ã³ã¿ãŒã«é©çšããããšãã§ããŸãã
ãããŸããªãªã³ã±ãŒãž
C ++ã®äžéšã®æ§é ã§ã¯ããªããžã§ã¯ããã¡ã€ã«ã«ã¹ããŒã¹ãå¿ èŠã§ãããè€æ°ã®ç¿»èš³åäœã§åæã«è¡šç€ºã§ããŸãããããã¯ãã€ã³ã©ã€ã³é¢æ°ãä»®æ³é¢æ°ããŒãã«ïŒVTablesïŒãtype_infoãªããžã§ã¯ããããã³ãã³ãã¬ãŒãã®ã€ã³ã¹ã¿ã³ã¹åçµæã§ããGCCã¯ããªããžã§ã¯ããã¡ã€ã«ã®COMDATã»ã¯ã·ã§ã³ã§ã®ãã®ãããªãªããžã§ã¯ãã®é 眮ããµããŒãããŸããããã«ããããªã³ã¯æ®µéã§ã®éè€ãªããžã§ã¯ããæé€ãããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ããã³å®è£ ãã©ã°ã
ãã®ãããªãã©ã°ãã䜿çšãããšããªããžã§ã¯ããã€ã³ã¿ãŒãã§ã€ã¹ã§ãããå®è£ ã§ããããã³ã³ãã€ã©ã«æç€ºçã«äŒããããšãã§ããŸãããç¡éãªã³ã¯ããžã®è¿œå ã®æŸèæã
ã€ã³ã¹ã¿ã³ã¹ãã¿ãŒã³
GCCã§ãã³ãã¬ãŒããã€ã³ã¹ã¿ã³ã¹åããæ¹æ³ãç¹å®ã®ãã³ãã¬ãŒããã©ã¡ãŒã¿ã«å¯ŸããŠãåãã³ãã¬ãŒãã€ã³ã¹ã¿ã³ã¹ã®1ã€ã®ã³ããŒã®ã¿ãçæãããããšãä¿èšŒããã¡ãœããããããã¯ã¯å€§ããã®ã§ãããã§èšåããŸãã
ã¯ã©ã¹ã®ã¡ã³ããŒé¢æ°ãžã®ãã€ã³ã¿ãŒãã颿°ãã€ã³ã¿ãŒãååŸãã
æäœ '-> *'ããã³ 'ã*'ã«é¢é£ä»ããããæ©èœã®æãããªæ¡åŒµãäœã¬ãã«ã®ã¯ã©ã¹ãã£ãŒã«ããžã®ãã€ã³ã¿ãŒãã¯ã©ã¹å ã®ãã®ãã£ãŒã«ãã®ãã€ããªãã»ããã§ããå Žåãã¡ãœãããã€ã³ã¿ãŒã¯æ¬æ Œçãªé¢æ°ãã€ã³ã¿ãŒã§ãããGCCã¯ã¡ãœãããã€ã³ã¿ãŒã®åãéåžžã®é¢æ°ãã€ã³ã¿ãŒã«ãã£ã¹ãããæ©èœã远å ããŸãã
C ++屿§
äžéšã®å±æ§ïŒ__attribute__ããŒã¯ãŒãã§æå®ïŒã¯ãC ++ã«ã®ã¿é©çšã§ããŸããããã€ãã®äŸïŒabi_tag-倿°åãšé¢æ°åã®ãã³ã°ãªã³ã°ãæå®ããæ¹æ³ãinit_priority-ã°ããŒãã«ãªããžã§ã¯ãã®åæååªå é äœã
è€æ°ã®æ©èœããŒãžã§ã³ã®å®£èš
奜å¥å¿opportunityçãªæ©äŒãã¿ãŒã²ãã屿§ã䜿çšãããšãããã»ããµã®ç¹æ§ïŒããšãã°ã1ã€ãŸãã¯å¥ã®ã³ãã³ãã»ããã1ã€ãŸãã¯å¥ã®ããã»ããµã¢ãã«ãªã©ã®ãµããŒãã®å¯çšæ§ïŒã«å¿ããŠãåã颿°ã®è€æ°ã®ããŒãžã§ã³ã宣èšã§ããŸããæ¡ä»¶ä»ãã³ã³ãã€ã«ã«å€å°äŒŒãŠããŸããããã¹ãŠã®é¢æ°ãã³ã³ãã€ã«ãããå®è¡æã«å¿ èŠãªé¢æ°ãéžæãããŸãã
é¢é£ä»ããããåå空é
ãã®æ©èœã¯ãã€ã³ã©ã€ã³åå空éãšåçã§ãïŒãããã£ãŠãéæšæºã®å®è£ ã¯GCCã®å°æ¥ã®ããŒãžã§ã³ã§åé€ãããŸãïŒã
ã¿ã€ãç¹æ§
ã³ã³ãã€ã«æã«ããŸããŸãªã¿ã€ãã®æ å ±ãã³ã³ãã€ã«ã§ããç¹å¥ãªæ§é ã®ã³ã³ãã€ã©ã¬ãã«ã®ãµããŒãããããã®å€ããããããããããã®ãããã¯ãåå¥ã«æ€èšããã®ãçã«ããªã£ãŠããŸãïŒç¹ã«ããã³ãã¬ãŒãã«å®è£ ãããé¡äŒŒã®æ§é ãDèšèªã®é¡äŒŒã®æ§é ãšæ¯èŒããŠïŒããããäœã§ããããæç¢ºã«ããããã«ãããã«ããã€ãã®èŠçŽ ããããŸãã
__is_abstract (type) __is_base_of (base_type, derived_type) __is_class (type) __is_empty (type) __is_enum (type) __is_literal_type (type)
C ++ã®æŠå¿µ
æã匷åãªæ©èœãæ®å¿µãªãããææ°ã®ïŒC ++ 17ïŒæšæºã«è©²åœããŸããã§ããããã³ãã¬ãŒãåŒæ°ã«æç€ºçã«å¶éãèšå®ããæ¹æ³ïŒã€ãŸãããã³ãã¬ãŒãã®äžæã®å ¥åãå°å ¥ããïŒã«ãããã¡ã¿ããã°ã©ãã³ã°ãããç°¡åã«ãããçè§£ããããããŸãã
æšå¥šãããªãããæ¢ã«åé€ãããæ©èœ
ãããããã ãããã®æ©èœã¯åé€ããããã䜿çšãæšå¥šãããŠããªããšå®£èšãããŠããããŸããªãåé€ãããŸãã
- G++ void* .
- '<?', '>?', '<?=' '>?=' ( , )
- ( )
- new
- float complex ( )
- implicit typename extension ( )
- , typedef' ,
- . , ?
- æµ®åå°æ°ç¹åã¯ã©ã¹ã®å®æ°ãã£ãŒã«ããã¯ã©ã¹å®£èšã§çŽæ¥åæåããŸããæšæºã§ã¯ãæŽæ°ãã£ãŒã«ããšåæã®ã¿ãå¯èœã§ãã
äžäœäºææ§
以åã®ããŒãžã§ã³ã®C ++ããã³Cãšã®äžäœäºææ§ã®ããã€ãã®æ©èœããããã®æ©èœã¯ãç¹å¥ãªã³ã³ãã€ã©ãªãã·ã§ã³ã«å«ãŸããŠããŸãã
- forã«ãŒãã§å®£èšããã倿°ã¯ã以åã¯ã«ãŒãå€ã§äœ¿çšã§ããŸããã-fpermissiveãªãã·ã§ã³ã䜿çšãããšãå€ãåäœãè¿ãããšãã§ããŸãã
- å€ãCããããŒãã¡ã€ã«ã«ã¯extern "C"ã³ã³ã¹ãã©ã¯ããå«ãŸããŠããŸããã§ãããç¹å¥ãªã³ã³ãã€ã«ã¢ãŒãã§ã¯ããã®ãããªãã¹ãŠã®ãã¡ã€ã«ãCèšèªãã¡ã€ã«ãšèŠãªãããšãã§ããŸãã
ä»ã®ãšãããã¹ãŠã§ãã
ã芧ã®ãšãããäžéšã®æ¡åŒµæ©èœã¯æ¡åŒµæ©èœãšåŒã°ããããšããã»ãšãã©ãããŸããïŒãããã¯ããç¥ãããŠããæ©èœã§ããããããã«æªãããšã«ãäžéšã®å€ä»£ããã³ç¶æ¿ãããæšæºãšã®äºææ§ã確ä¿ããèšèªèšèšã®å€±æããæ±ºå®ãåé¿ããããã«èšèšãããæŸèæãªã©ã§ã
åæã«ãä»ã®ãã®ã¯èšèªæ©èœã®çã®çç ã§ãããããããæšæºã«å«ãŸããŠããªãã®ã¯æ®å¿µã§ãã