3.预处理详解
3.1预定义符号:
__func__, __FILE__, __LINE__, __DATE__, __TIME__
int main()
{
int i = 0;
FILE* pf = fopen("log.txt", "w");
if (pf == NULL)
{
return 1;
}
for (i = 0; i < 10; i++)
{
fprintf(pf,"name:%s file:%s line:%d date:%s time:%s i=%d\n", __func__, __FILE__, __LINE__, __DATE__, __TIME__, i);
}
fclose(pf);
pf = NULL;
}
打开对应路径下的文件,就可以发现
此外,__stdc__//如果编译器遵循ansi c,其值为1,否则未定义
3.2#define
1.定义标识符常量
例如:
#define NUM 100
#define STR "abcdef"
int main()
{
int num = NUM;
char* str = STR;
}
或者
#define reg register
int main()
{
int reg num = 100;
}
2.定义宏:#define允许把参数替换到文本中,这种现象通常称为宏
宏的声明方式:#define name(parament-list) stuff
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
int a = 10;
int b = 20;
int c = MAX(a, b);
printf("%d\n", c);
}
或者
#define SQUARE(x) ((x)*(x))
int main()
{
int a = 9;
int r = SQUARE(a + 1);
printf("%d\n", r);
}
注意:
1.宏的定义末尾不能出现;
2.参数列表的左括号必须与name紧邻
3.不要吝啬括号
3.#define替换规则
4.宏和函数对比
宏通常被应用于执行简单的运算,比如刚才所写的找出两个数较大的一个
优点:此时,宏比函数在程序的规模和速度上更胜一筹,且宏是类型无关的。
缺点:宏无法调试;如果宏比较长,会大幅度增加程序的长度;宏可能会带来运算符优先级的问题
5.条件编译
常见的条件编译指令:
1.#if #endif
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
arr[i] = i + 1;
#if 1
printf("%d ", arr[i]);
#endif
}
}
2.#if #elif #else #endif
#define NUM 2
int main()
{
#if NUM==1
printf("hehe\n");
#elif NUM==2
printf("haha\n");
#else
printf("heihei\n");
#endif
}
3.#ifdef #endif
#define MAX 0
int main()
{
//#if defined(MAX)
// printf("hehe\n");
//#endif
#ifdef MAX
printf("hehe\n");
#endif
}
//判断宏是否被定义了