Macro typology - ytomino/headmaster GitHub Wiki
Contents
Cèšèªã§ã#defineã®å®éã®äœ¿ããæ¹ãåé¡ãããã®ãCã®ããããèªããã©ã³ã¹ã¬ãŒã¿(æªå®)ãæžããŠãããšãã«èŠã€ããããã¯é ·ãéãšæã£ãŠããã ããã°ã è¯ãäŸãšãæªãäŸãšãåããŠããã€ããã¯ãªããŠãå šéšæªãäŸã®ã€ããã§ãã
#define HAS_FUNC ... #ifdef HAS_FUNC ... #endif
äžçªããããäœ¿ãæ¹ã å€é#include鲿¢ã«ã¯å¿ é ã§ããâŠâŠã
ããããééããšããŠã¯ãconfigureã®çæããHAVE_XXXã#ifdefã§äœ¿ã£ãŠããŸããªã©ã(ç¡ããšãã 0
ã§å®çŸ©ããã)
#define TARGET 100 ... #if defined(TARGET) && TARGET >= 105 ... #endif
Windows APIãLinuxã®ããããŒçã«èŠãããŸãã 察象ãšããOSã®ããŒãžã§ã³ãªãããå€ããæå®ã§ããããã«ãªã£ãŠããããã§ããã ã¡ãªã¿ã«åã«definedãå ¥ã£ãŠããã®ã¯æ°ãå©ããŠããæ¹ã§ãã
#define HAS_FUNC 1 ... #if HAS_FUNC ... #endif
確ãã«ããã§ãæ£ããåãã¯åãã
ãã ã 0
ã«#defineããããšæ¡ä»¶ãåœã«ãªãã®ã§æ³šæãå®å®³ã¯ããŸããªãã
mcppçã®æ°ã®å©ããããªããã»ããµã¯ãªãã·ã§ã³ã«ãã£ãŠãæªå®çŸ©ã·ã³ãã«ã0ã«è©äŸ¡ãããšãèŠåãåºããŸãã
#define TARGET 100 ... #if defined(TARGET) ... #endif ... #if TARGET >= 105 ... #endif ... #if TARGET ... #endif
æ··åšãããŠããã#defineãããå 容次第ã§ã¯ã¡ãã¯ãã«ãªã£ãŠããŸããã§ããã£ã±ãå®å®³ã¯ããŸããªãããšãå€ãã 倧æµã¯çç±ããªãäžçµ±äžãªã ããæããŠãã ããâŠâŠã
#define FOR_INCLUDE_HEADER <are.h> ... #include FOR_INCLUDE_HEADER
mcppã®ããã¥ã¡ã³ãã§ãããªãããŠãäœ¿ãæ¹ã§ããâŠâŠåå¥è§£æã®æç¹ã§ <
are
.
h
>
ã«åè§£ãããã¯ããªãã§ããããããã
ã§ã#
ããªãã®ã§ãéã«ã¹ããŒã¹ãå
¥ã£ãŠãããšè§£éãããã¯ããªãã§ãããã
ããªããã»ããµã®äžã®äººã倧å€ã§ãã
ããã«ã¯ãªãŒããŒã·ã§ã³ã®#includeã§ãã·ã¹ãã ã®ããããŒã¯æ¢ããŠãããŸãã®ã§ã #define FOR_INCLUDE_HEADER "are.h"
ã§äœã®åé¡ããªãã¯ãã§ãã
#define VALUE 100
æ®éã®äœ¿ãæ¹ã§ã¯ããã®ã§ãããå®ã¯ãã®æç¹ã§ããé ·ãã ãã¯ãå šè¬ã«èšããããšã§ãããVALUEãšããååã®ããŒã«ã«å€æ°ã宣èšã§ããªããªã£ãŠããŸããŸãã æ¡ä»¶ã³ã³ãã€ã«çšã®ã·ã³ãã«ã¯å€§æµè¢«ããªãããã«ãããåãªã©ã§è£ 食ãããŠããŸããã宿°å€ã¯ãããããååãã倧éã«æŒãããããŠããããšãå€ãã ä»®ã«C++ã䜿ã£ãŠããŠããnamespaceããç¡èŠãããå¶æªå ·åã enumãconstã䜿ããŸãããâŠâŠã
#define VALUE 100 + 200
åŒã«ãªã£ãŠããã®ã«æ¬åŒ§ãã€ããŠããªãããã VALUE * 2
ãªããŠäœ¿ããããšæå³ããªãå€ã«ãªã£ãŠããŸããŸãã
ããã§ãã䜿ãåŽã§æ¬åŒ§ãè£ãã°åé¿å¯èœãªããããã·ãªæ¹ã
ã¡ãããšæ¬åŒ§ãâŠâŠã§ã¯ãªããŠãenumãconstãâŠâŠã
#define VALUE \ | A \ | B \ | C
æŒç®åã綺éºã«æããŠã¯ããã®ã§ãããAã®é ã® |
ãäœèšã§ãã
ãã¯ãã¯äœ¿ããããŸã§æ§æãã§ãã¯ãå
¥ããªãã§ããããâŠâŠã宿°ã倧éã«å®£èšããŠããããããŒã®å Žåãå
šéšç¢ºèªãããŠãªãããšãå€ãã
é¡åã§ãæ¬åŒ§ã®æ°ãåã£ãŠããªããçã
enumãconstãªã䜿ããªããŠãæ§æãã§ãã¯ã¯å
¥ãã®ã«âŠâŠã
#define ZERO_POINT {0, 0}
äœ¿ãæ¹ã¯ struct point p = ZERO_POINT;
ã
åæåéšåã«æžããªããšãšã©ãŒã§ããã
C99ãªãcompound literalãšã㊠(struct point){0, 0}
ãšæžããã»ãããåæå以å€ã®åŒäžã§ã䜿ããŸãããåãããã£ãŠãã©ã³ã¹ã¬ãŒã¿ã«ãå¬ããããããããšãããã§ããã
#define ADD(a, b) ((a) + (b))
æ®éã®äœ¿ãæ¹ã§ã¯ããã®ã§ãããå®ã¯ãã®æç¹ã§(ry ãšããã§æè§Cèšèªã«ãinlineãå ¥ã£ããã§ãããå šé¢çã«æžãçŽããŸããããâŠâŠã
#define offsetof(T, FIELD) ((char *)&((T *)0)->FIELD - (char *)0)
offsetofãå žåã§ãããããªãšãŒã·ã§ã³ãããã€ããããŸãã ããªãã¯ãããŠãŸãã仿¹ãªãã®ã§ããããã
#define COMPARE(A, OP, B) (func(A) OP func(B))
äœ¿ãæ¹ã¯ COMPARE(10, >=, 5)
ã®ããã«äºé
æŒç®åãæž¡ããŸãã
CèšèªãæŒç®åã颿°ãšå¥ç©ãšããŠæ±ã£ãŠãã®ããããªããããéšåé©çšãç¡ãã®ããããªãããã
âŠâŠã§ã綺éºã«æžããªã inline bool LE(int a, int b){ return a < b; }
ã¿ãããªãã®ãäžæãçšæããŠãããã¹ããšæããŸãã
#define func(a) func_impl((void *)a, sizeof(a))
inline颿°ãšããŠæžãçŽããªãäŸã è€æ°çš®é¡ã®æ§é äœãåãä»ãã颿°ãšããæ§é äœã®ãã£ãŒã«ãã远å ãããŠãäºææ§ãåããšããçç±ã¯ãããã ãšæããŸãã åãä»ããããªãã®ã§ãã©ã³ã¹ã¬ãŒã¿ã®æµã
#define LSHIFT8(V) V##00
LSHIFT8(0x12)
ã¿ããã«äœ¿ããããã§ãã
ãªãã§ (V) << 8
ã§ã¯ãã¡ãªãã§ããããâŠâŠã
ç§ã«ã¯çè§£ã§ããŸããã
#define funcAB(a, b) do { funcA(a); funcB(b); } while(0)
æåŸã® ;
ãç¡ãã®ããã€ã³ãã
ãšããã§æè§Cèšèªã«ãinlineãå
¥ã£ããã§ãããå
šé¢çã«æžãçŽããŸããããâŠâŠã
#define funcAB(a, b) do { funcA(a); funcB(b); } while(0);
ifæã§äœ¿ããšelseãç¶ããããªããªããŸãã inline颿°ãªããããªãã¹ãããªãã®ã«âŠâŠã
extern int add10(int a); #define add10(a) ((a) + 10)
颿°ã¢ãã¬ã¹ãåãããããã©ãã€ã³ã©ã€ã³å±éãããããšããäœ¿ãæ¹ã§ããã
åŒæ°ãããã¯ããåŒæ°ãªãã§äœ¿ããšå±éãããªãããšãå©çšããŠããŸãã
ãšããã§C99以éãªãã€ã³ã©ã€ã³é¢æ°ãæ®éã« inline
ãšã ã宣èšããã°ãåæ§ã®å¹æãåŸãããŸãããgccãªã extern inline __atteribute__((__gnu_inline__))
ã§ã
void f(void); void custom_f(void); #define f custom_f
äœããã®è¿œå åŠçãå¿ èŠãªãšãã«æ¢å颿°ãä¹ã£åãæ¹æ³ã æ£çµ±ãªããæ¹ãšããŠã¯ãã¡ãããšå 颿°ã«ããã¯ã仿ããããããã«ããŠãããã¹ãã§ããã ãããªã®ã§æžãŸããŠããã絶察æŒããåºãŸãã mainãä¹ã£åãã®ãæå¶ãã¿ãŒã³ãSDLãªã©ã
#define T int
å²ãšèŠãŸããããã£ã±ããã®æç¹ã§ããªãé ·ãããšã¯ç¢ºãã§ãã typedefã䜿ããŸãããã
#define CONST const
constã®ãªãå€ãã³ã³ãã€ã©ã«å¯Ÿå¿ããŠãããŠããã§ããããâŠâŠã
constãªãæè¿ã¯ãµããŒãããŠãªãã³ã³ãã€ã©ãªããŠç¡ãã§ãããããçŽæ¥constãšæžããã§æžã¿ãŸãããrestrictãªããã¯ããŸããåæ
ã§ããªãããªãã§ãã
ã§ãæé»ã®intã«ãŒã«ã絡ãã ããããšè¿·æãªãã¯ãã«ã¯éããªãã
complex.hã® #define complex _Complex
ã¯complexãçŽæ¥äºçŽèªã«ããããªããããã«ããããããããã£ãŠããã¿ãŒã³ã
#define CONST(T) const T
çšéãšããŠã¯åäžã 颿°å®£èšã«__stdcallãä»å ããããããããã åºæ¬çã«ã¯ãœãŒã¹ãèªã¿ã«ããããŠãã ããšæãããŸãããããã颿°ãã¯ãã«ããªããŠããäžã®åŒæ°ãªãã®ãã¿ãŒã³ã«ã§ãããªããã£ã¡ã®æ¹ããã·ãªæ°ãããŸããäœãããã©ã³ã¹ã¬ãŒã¿ã«ãšã£ãŠã¯åŒæ°ãªãã®æ¹ãæ±ããããã®ã§âŠâŠã
#define T int *
Cèšèªã®æ§æãçè§£ããŠãããã®æåãªèžã¿çµµã
declaration-specifiersã«åãŸã£ãŠãŸããã
ãããªã®èª¬æããããªããã§ããâŠâŠ T a, b;
ãšãã颚ã«äœ¿ããšã§ããâŠâŠã
æ°ã¥ãã«ããã ãçœ ã«ãªããŸãã
typedefã䜿ããŸãããã
#define EXTERN extern
ã©ã€ãã©ãªæ¬äœã®ãœãŒã¹ã.dllãšããŠã³ã³ãã€ã«ãããšãã¯__declspec(dllexport)ã«#defineãçŽããŠäœ¿ã£ããã
... //ç¹ã«#ifãšãã¯ãªã #define IMPORT __declspec(dllimport)
ãã¯ãã ããã£ãŠå®éã«ã¯äœ¿ãããŠãªãã£ããããŸãã ãããŸãã«ãã£ããããã
#define PARAMS bool a, const char * b, int c
ãããã§ããâŠâŠãããâŠâŠã æ¡ä»¶ã³ã³ãã€ã«ã«ãã£ãŠåŒæ°ã墿žããããããªãã¶ã€ã³ã¯ãããªãã§ãã ãããâŠâŠãåãå€ãããã ããªãtypedefã§å åã§ããã
#define THOSE_VALUE 100 ... #define THESE_VALUE THOSE_VALUE
å¥ã®é¢æ°ããã¯ãã«å¥åãäžããäŸã ç¹°ãè¿ããŸããtypedef, enum, const, ã€ã³ã©ã€ã³é¢æ°ã§ä»£æ¿ã§ãããã®ã¯ãã¡ãã䜿ã£ãŠãã ããâŠâŠã
struct S { int the_field_name; }; #define old_field_name the_field_name
å®éã®æ§é ã¯å€åããã€ã€ãäºææ§ãä¿ã€ç®çã§ããã åºã䜿ãããŠããŠä»æŽã¢ã¯ã»ãµé¢æ°ã䜿ã£ãŠãããããã«ã§ããªããªã©ãçç±ã¯ããããã§ããããããªããšãç¶ããŠããŠããã®ãã¡ç Žç¶»ããããªâŠâŠã
#ifdef HAS_THOSE #define THOSE_VALUE 100 #endif ... #define THESE_VALUE THOSE_VALUE
å ã®ãã€ãæ¡ä»¶ã«ãã£ãŠã¯å®çŸ©ãããªãã®ã«ãå¥åã¯åžžã«å®çŸ©ãããã çµæ§ãããã§ãâŠâŠã
... //THOSE_VALUEã¯å¥ããã #define THESE_VALUE THOSE_VALUE
äžã®ããªãšãŒã·ã§ã³ã åžžã«ãµãã€ã»ããã§#includeãæžããŠãããããŠæ°ä»ããªãããšãå€ããšæããŸãã ããããã¡ã€ã«ã¯åç¬ã§èªãŸããå Žåã§ãã³ã³ãã€ã«ã§ããããã«æžããŠããã ãããå¬ãããªãããšã¯æããã§ããâŠâŠãã¯ãã®å Žåãã§ãã¯ãé£ãããã§ãããã䜿ã£ãŠã¿ããããªãã ãã¯ãå¯èœãªéãtypedef, enum, const, ã€ã³ã©ã€ã³é¢æ°(ry
#define LONG_NAME_MACRO 100 ... #define SHORT_ALIAS LONG_NAMAE_MACRO
ãããã倧éã«å®£èšããŠããããããŒã®å Žåãå šéšç¢ºèªãããŠãªãããšãå€ãâŠâŠä»¥äžç¥ã
#define _T(text) L##text
windows.hã®æåãªãã€ã§ããã ä»ã«ã¯æŽæ°å®æ°ã«ULLããã£ã€ãããçã
#define static_assert(a) typedef int SA##__LINE__ [a ? 1 : -1];
äžèº«ã¯ãªãã§ããããã§ãããèŠããã«0ãæž¡ãããã³ã³ãã€ã«ãšã©ãŒã«ãªãã³ãŒãã§ããã C11ããã¯_Static_assertã䜿ããŸãã
glibcã®<sys/sysmacros.h>ããæç²ã
#define __SYSMACROS_DM(symbol) __SYSMACROS_DM1 \ (In the GNU C Library, #symbol is defined\n\ by <sys/sysmacros.h>. For historical compatibility, it is\n\ currently defined by <sys/types.h> as well, but we plan to\n\ remove this soon. To use #symbol, include <sys/sysmacros.h>\n\ directly. If you did not intend to use a system-defined macro\n\ #symbol, you should undefine it after including <sys/types.h>.)
ä»»æã®ãšã©ãŒã¡ãã»ãŒãžãåºåããããã«\nããªãã©ã«ã®å€ã«æžããŠããŸãããããªã«äžã®äžãæãã®ã§ããã£ãŠæãã§ãããæ«æçç¶ã§ãã çŽ çŽã«_Static_assertã䜿ããŸãããã
詳ããã¯æžããŸãããããªãããŒãªãã¯ãã®åµã 誰ã ããããªã®æšæºã«å ¥ãã銬鹿ã¯âŠâŠããããªã®æ¡çšãããªãçŽ çŽã«ãªãŒããŒããŒããå ¥ããŠãã ãããã
ã¡ãªã¿ã«clangã§ã¯Cèšèªã§ããªãŒããŒããŒãã䜿ããŠãtgmath.hã¯ããã§å®çŸãããŠããŸãã
å§çްçç¥ã
å§çްçç¥ã