Learn And Life.

c语言中的宏

宏是关键字define定义,一种简单的字符串替换方式,可以分为带参数和不带参数两种。

1.#和##在宏中的使用

1
#define ERROR_LOG(x) fprintf(stderr,"Error:"#x"\n");

对参数x使用#引用,实现对参数器字符数组化预处理,如果调用ERROR_LOG(“error log”),则输出Error:“error log“

1
#define TYPE(type,name) type name_##type##_type

使用##,预处理器实现字符串之间分隔连接方式,如果调用TYPE(int,”user”), 则预处理之后int name_int_type,这样实现了变量的类型定义

1
2
#define NUMBERS 1,2,3
int x[] = { NUMBERS };

可以使用这种方式来实现创建一个数组

2.do…while

1
2
3
4
#define PRINT(x) \
do{ \
printf("print x\n"); \
}while(0)

使用do…while…来包裹,实现语言结构的独立

3.函数宏

1
#define lang_init() c_init()

调用lang_init(),实现c_init()函数的调用

4.宏参数

1
#define min(X, Y) ((X) < (Y) ? (X) : (Y))

调用x = min(a, b);实际上是x = ((a) < (b) ? (a) : (b)); 执行

5.预定义宏
COUNTERGFORTRANGNUCGNUC_MINORGNUC_PATCHLEVELGNUGSTRICT_ANSIVERSIONNO_INLINEGNUC_GNU_INLINEOPTIMIZE
等等

6.#ifdef …. #else …. #if … #endif

7.PHP中常见的宏

1
2
3
4
5
6
7
# define CG(v) TSRMG(compiler_globals_id, zend_compiler_globals *, v)
# define EG(v) TSRMG(executor_globals_id, zend_executor_globals *, v)
# define PG(v) TSRMG(core_globals_id, php_core_globals *, v)
# define SG(v) TSRMG(sapi_globals_id, sapi_globals_struct *, v)
# define PG(v) TSRMG(core_globals_id, php_core_globals *, v)
# define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)-1)
# define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element)