宏定义:
不带参数的宏:
定义宏的结构 #define 宏名 字符串
#define PI 3.1415926 //使用 PI 代替了3.1415926
如:
#define u "hello world"
int main(int argc, char *argv[]) {
printf(u);
return 0;
}
运行结果
若宏定义的内容在字符串内,则不进行替换
如:
#include <stdio.h>
#include <stdlib.h>
#define Char "this is an example"
int main(int argc, char *argv[]) {
char str[30] = "Char is ?";
printf("%s
",str);//打印出的结果并未进行替换
return 0;
}
运行结果
带参数的宏
如:
#include <stdio.h>
#include <stdlib.h>
#define math(a,b) a+b*b
int main(int argc, char *argv[]) {
int x = 1,y = 2;
printf("%d",math(x,y));
return 0;
}
运行结果
#include <stdio.h>
#include <stdlib.h>
#define math(a,b) (a+b)*b
int main(int argc, char *argv[]) {
int x = 1,y = 2;
printf("%d",math(x,y));
return 0;
}
运行结果
条件编译
格式:#if 常数表达式
语句段 //如果条件为真,则该段被编译,否则跳过此段
#endif
如:
#include <stdio.h>
#include <stdlib.h>
#define NUM 50
int main(int argc, char *argv[]) {
int i = 0;
#if NUM>50
i++;
#endif
#if NUM == 50
i = i+50;
#endif
#if NUM<50
i--;
#endif
printf("%d",i);
return 0;
}
运行结果
#include <stdio.h>
#include <stdlib.h>
#define NUM 10
int main(int argc, char *argv[]) {
int i = 0;
#if NUM>50
i++;
#endif
#if NUM == 50
i = i+50;
#endif
#if NUM<50
i--;
#endif
printf("%d",i);
return 0;
}
运行结果
#include <stdio.h>
#include <stdlib.h>
#define NUM 50
int main(int argc, char *argv[]) {
int i = 0;
#if NUM > 50
i++;
#else
#if NUM < 50
i--;
#else
i = i+50;
#endif
#endif
printf("%d",i);
return 0;
}
运行结果
#include <stdio.h>
#include <stdlib.h>
#define NUM 100
int main(int argc, char *argv[])
{
int i = 0;
#if NUM > 50
i++;
#elif NUM == 50
i = i+50;
#else
i--;
#endif
printf("%d",i);
return 0;
}
#line命令 __LINE__存放当前编译的行号,__FILE__存放当前编译的文件名,两个关键字的前后都是两个下划线,
格式
#line 行号["文件名"]
例如:
__LINE__
#line 22"123.c" //从22开始相加到执行编译的行数
#include <stdio.h> //从这行开始起计数为 0
#include <stdlib.h> //第1行
//第2行
//第3行
int main() { //第4行
printf("1当前行号:%d
",__LINE__);//第5行
printf("3当前行号:%d
",__LINE__);//第6行
return 0;
}
运行结果
__FILE__
#line 22"123.c"
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("1当前行号:%s
",__FILE__);//当前编译的文件
printf("3当前行号:%s
",__FILE__);//当前编译的文件
return 0;
}
运行结果