宏 __FILE__ //以字符串形式返回所在文件名称
__func__ // 所在函数名称
__LINE__ // 所在代码行
#ifdef DEBUG
#define log(frm, arg...){ \
printf("[%s : %s : %d]",__FILE__, __func__, __LINE__);\
printf(frm, args);\
// => printf(frm, ##args) ## 连接可以允许args为空
printf("\n"); \
}
#else
#define log(frm, args...)
#endif
int main() {
int a = 123;
log("%d %d",a, b);
log("hello world");
return 0;
}
#define contact(a, b) a##b
int main() {
int abc, def;
int abcdef = 0;
contact(abc, def) = -1;
log("%d", abcdef);
retrun 0;
}
//输出abcdef = -1
可以先在源码文件中定义 #define DEBUFG
或者 gcc -DDEBUG xxx.c
gcc -E // 预编译
__attribute__((constructor)) // 宏定义给下面的函数添加属性值 :constructor使其优于主函数执行
#include <studio>
__attribute__((constructor))
void func() {
int a = 3, b = 5;
printf(“%d + %d = %d”, a, b, a + b);
return 0;
}
int main() {
return 0;
}
泛型宏
#include < studio>
#define TYPE(a) _Generic(a), \
int : “%d\n”, \
double : “%.2lf\n,”\
char* : “%s\n”\
}
int main() {
int a = 54;
double b = 52.412;
char str[] = “hello world”;
printf(TYPE(a), a);
printf(“\n”);
printf(TYPE(b), b);
printf(TYPE(c), c);
return 0;
}
字符数组 一定要自己初始化
初始化字符数组
string.h
strlen(str) //以\0作为结束符
strcmp(str1, str2); strncmp(str1, str2, n);
strcpy(dest, src); strncpy(str1, str2, n);
stdio.h
scanf(str1, format,...)
sprintf(str1, format,...);
memset(str1, c, n). 内存设置
