一、预定义符号
预定义符号
FILE:进行编译的源文件。
LINE:文件当前行号。
DATE:文件编译的日期。
TIME:文件被编译的时间。
例子:
二、#define
#define可以根据使用者需求定义一些名字然后进行赋值,在程序预处理的时候会将自己定义的名字所含有的值替换进所引用的地方
定义标识符
语法:
#define Student stu
定义宏
例子1:
例子2:
这里的70怎么计算的呢?
#define定义的宏,会在程序编译的时候全部替换,所以后面关于z的表达式会被替换为:
z=2*(4+(4+2)*5+1);最后算得结果为70,所以在使用#define的时候,结果往往出入意外,所以使用define时注意搭配括号
注意:
使用#define一般不需要在结尾添加结束符分号;如果添加了分号,需要在后续使用中注意,因为#define定义的宏会吧分号也替换进去,容易导致语法错误。
宏跟函数的对比:
宏的优点:
1:宏相比于函数一般来说所占用的代码长度短。
2:宏相比于函数一般来说执行速度更快。
宏的缺点:
1:宏使用的时候需要考虑优先级,有时候需要用括号来提高优先级,防止出错,而函数则不需要。
2:宏如果在代码的多个地方出现进行参数求值的时候可能会产生不可预料的后果。
3:宏不可以调试。
#define替换规则
1. 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。
2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。
三、#undef
用来移除一条宏定义
//语法:
#undef NAME
//如果现存的一个宏需要重新定义,那么他的旧名字首先要移除
四、条件编译
在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的。因为我们有条件编译指令。
1.#if defined(#ifdef)
#include <stdio.h>
#define __DEBUG__
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i < 10; i++)
{
arr[i] = i;
#ifdef __DEBUG__//如果__DEBUG__有定义,则printf("%d\n", arr[i]);参于编译
printf("%d\n", arr[i]);
#else
printf("0\n");//否则printf("0\n");参于编译
#endif //__DEBUG__
}
return 0;
}
2.#if !defined(#ifndef)
#include <stdio.h>
#define __DEBUG__
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i < 10; i++)
{
arr[i] = i;
#ifndef __DEBUG__//如果__DEBUG__没有定义,则printf("%d\n", arr[i]);参于编译
printf("%d\n", arr[i]);
#else
printf("0\n");//否则printf("0\n");参于编译
#endif //__DEBUG__
}
return 0;
}
3.#if
#include<stdio.h>
#define M 5
int main()
{
#if M<5//M<5为printf("q\n");参与编译
printf("q\n");
#elif M==5//否则M==5为真printf("w\n");参与编译
printf("w\n");
#else//否则printf("e\n");参与编译
printf("e\n");
return 0;
}
4.嵌套指令
#if defined(OS_UNIX)
#ifdef OPTION1
unix_version_option1();
#endif
#ifdef OPTION2
unix_version_option2();
#endif
#elif defined(OS_MSDOS)
#ifdef OPTION2
msdos_version_option2();
#endif
#endif
五、文件包含
#include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方 一样。 这种替换的方式很简单: 预处理器先删除这条指令,并用包含文件的内容替换。 这样一个源文件被包含10次,那就实际被编译10次。
头文件包含方式分两种
1.本地文件包含方式#include “xxx.h”;
2.库文件包含方式#include <xxx.h>
这两种查找方式的查找策略不同:
#include" xxx.h "查找策略:先去代码所在路径下查找,如果找不到,再去库目录下查找
#include< xxx.h >查找策略:直接去库目录下查找
避免头文件重复包含方式
方法1:
#ifndef __TEST_H__
#define __TEST_H__
// 头文件的内容
#endif //__TEST_H__
方法2:
#pragma once