预处理
详解:C语言程序的编译+链接
预定义符号介绍
__FILE__
进行编译的源文件
__LINE__
文件当前的行号
__DATE__
文件被编译的日期
__TIME__
文件被编译的时间
__STDC__
如果编译器遵循ANSI C,其值为1,否则未定义
例:
#include <stdio.h>
int main()
{
printf("%s %d %s %s\n", __FILE__, __LINE__, __DATE__, __TIME__);
return 0;
}
运行结果:
预处理指令 #define
#define定义标识符
#define MAX 100
#define PRINT printf("hahaha\n")
int main()
{
printf("%d\n", MAX);
PRINT;
return 0;
}
#define定义的宏
例如:
#define MAX(x,y) x>y?x:y
int main()
{
printf("%d\n", MAX(1, 3));
return 0;
}
#define mul(x,y) x*y
int mian()
{
mul(2,2+3);
return 0;
}
#define的使用规则
宏和函数的对比
宏 | 函数 |
---|---|
代码插入到程序中,会使代码的长度变长 | 每次使用,只需要调用即可 |
执行速度快 | 有函数调用和返回的开销 |
存在优先级的问题,结果可能不是我们想要的 | 不存在这个问题 |
参数与类型无关 | 参数与类型有关 |
不能调试 | 可以调试 |
不能递归 | 可以递归 |
预处理操作符#和##的介绍
#define print(a) printf(#a" is %d\n",a)
int main()
{
int a = 6;
int b = 0;
print(a);
print(b);
return 0;
}
#define line(x,y) x##y
int main()
{
int ac = 20;
printf("%d\n", line(a, c));
return 0;
}
预处理指令 #include
预处理指令 #undef
条件编译
常见的条件编译
#if+常量表达式
#endif
#if+常量表达式
#elif+常量表达式
#else+常量表达式
#endif
判断是否被定义
1.#if defined(符号)
2.#if !defined(符号)
3.#ifdef 符号
4.#ifndef 符号
#ifndef 符号
#define 符号
//.....
#endif
#pragma once
例:
#define add(x,y) x+y
#define A
int main()
{
#if defined(A)
printf("%d\n", add(1, 2));
#endif
#ifdef A
printf("%d\n", add(1, 2));
#endif
return 0;
}