宏列表
在Mozilla的代码中常常用到。
可以方便地重用标识符列表。
#define FLAG_LIST(_) \
_(InWorklist) \
_(EmittedAtUses) \
_(LoopInvariant) \
_(Commutative) \
_(Movable) \
_(Lowered) \
_(Guard)
FLAG_LIST
的参数是一个宏,它将被依次调用与列表中的每一个标识符。
类型
#define DEFINE_FLAG(flag) flag,
enum Flag {
None = 0,
FLAG_LIST(DEFINE_FLAG)
Total
};
#undef DEFINE_FLAG
操作
#define FLAG_ACCESSOR(flag) \
bool is##flag() const {\
return hasFlags(1 << flag);\
}\
void set##flag() {\
JS_ASSERT(!hasFlags(1 << flag));\
setFlags(1 << flag);\
}\
void setNot##flag() {\
JS_ASSERT(hasFlags(1 << flag));\
removeFlags(1 << flag);\
}
FLAG_LIST(FLAG_ACCESSOR)
#undef FLAG_ACCESSOR
指定初始化
数组
/* Entries may not correspond to actual numbers. Some entries omitted. */
#define EINVAL 1
#define ENOMEM 2
#define EFAULT 3
/* ... */
#define E2BIG 7
#define EBUSY 8
/* ... */
#define ECHILD 12
/* ... *
char *err_strings[] = {
[0] = "Success",
[EINVAL] = "Invalid argument",
[ENOMEM] = "Not enough memory",
[EFAULT] = "Bad address",
/* ... */
[E2BIG ] = "Argument list too long",
[EBUSY ] = "Device or resource busy",
/* ... */
[ECHILD] = "No child processes"
/* ... */
};
结构体和联合体
struct point {
int x;
int y;
int z;
}
struct point p = {.x = 3, .y = 4, .z = 5};
联合体类似,但是只初始化一个字段。
用#if 0
来注释代码
#if 0
...
#endif
printf %m
打印errno
的出错内容。
如果errno=0
,输出Success
。
没有类型的变量
默认为int
g;main(i){
printf("g = %d, i = %d \n",g,i);
}
用宏来代替循环
以下代码打印1~200。
#include<stdio.h>
#define STEP1 step();
#define STEP2 STEP1 STEP1
#define STEP4 STEP2 STEP2
#define STEP8 STEP4 STEP4
#define STEP16 STEP8 STEP8
#define STEP32 STEP16 STEP16
#define STEP64 STEP32 STEP32
#define STEP128 STEP64 STEP64
#define STEP256 STEP128 STEP128
int n = 0;
int step()
{
if (++n <= 200)
printf("%d\n", n);
}
int main()
{
STEP256;
return 1;
}
结构体置0
struct mystruct a = {0};
把printf中的长度控制符放到参数里
用*
#include <stdio.h>
int main()
{
int a = 3;
float b = 6.412355;
printf("%.*f\n",a,b);
return 0;
}
scanf无视某个输入
用*
char last[20];
scanf("%*s %s", last);
第一个参数会被忽略。如输入John Smith
只会把Smith
读到last
里面。
scanf扫描字符集
用%[...]
,输出到字符串,^
代表扫描不在此字符集里的。
char *a;
/* .... */
scanf("%[^,]", a);
把逗号前的所有东西都读进来。
scanf("%[^,],", a);
把逗号前的所有东西都读进来,然后把缓冲区里的逗号吃掉。
拷贝字符串
while (*dest++ = *src++) ;