德化网站建设,南宁网站建设 传导,重庆今天刚刚发生的重大新闻,燕郊医院网站建设目录 编辑
1. #运算符
2. ##运算符
3. 命名约定
4. #undef
5. 命令行定义
6. 条件编译
7. 头文件的被包含的方式
8.嵌套文件包含
9. 其他预处理指令
10. 完结散花 悟已往之不谏#xff0c;知来者犹可追 …目录 编辑
1. #运算符
2. ##运算符
3. 命名约定
4. #undef
5. 命令行定义
6. 条件编译
7. 头文件的被包含的方式
8.嵌套文件包含
9. 其他预处理指令
10. 完结散花 悟已往之不谏知来者犹可追 创作不易宝子们如果这篇文章对你们有帮助的话别忘了给个免费的赞哟~ 1. #运算符 #运算符将宏的⼀个参数转换为字符串字面量。它仅允许出现在带参数的宏的替换列表中。 #运算符所执行的操作可以理解为”字符串化“。 当我们有⼀个变量 int a 10; 的时候我们想打印出 the value of a is 10 .就可以写 #define PRINT(n) printf(the value #n is %d\n,n);
int main()
{int a 10;PRINT(a);return 0;
} 运行效果如下~ 2. ##运算符 ## 可以把位于它两边的符号合成一个符号它允许宏定义从分离的文本片段创建标识符。 ## 被称 为记号粘合 这样的连接必须产生⼀个合法的标识符。否则其结果就是未定义的。 这里我们想想写⼀个函数求2个数的较⼤值的时候不同的数据类型就得写不同的函数。 比如 nt int_max(int x, int y)
{
return xy?x:y;
}
float float_max(float x, float y)
{
return xyx:y;
} 但是这样写起来太繁琐了现在我们这样写代码试试~ #define GENERIC_MAX(type)\
type type##_max(type x,type y)\
{\
return (x y ? x: y);\
}
使用宏定义不同的函数
GENERIC_MAX(int)//替换到宏体内后int##_max ⽣成了新的符号 int_max做函数名
GENERIC_MAX(float)//替换到宏体内后float##_max ⽣成了新的符号 float_max做函数名
int main()
{int m int_max(2, 3);printf(m%d\n, m);float n float_max(3.5f, 4.5f);printf(n%f\n, n);return 0;
} 运行效果如下~ 在实际开发过程中##使用的很少很难取出非常贴切的例子 3. 命名约定 一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分⼆者。 那我们平时的⼀个习惯是把宏名全部大写 函数名不要全部大写 4. #undef 这条指令用于移除一个宏定义 1. #undef NAME
2. //如果现存的⼀个名字需要被重新定义那么它的旧名字⾸先要被移除。5. 命令行定义 许多C的编译器提供了一种能力允许在命令行中定义符号。用于启动编译过程。 例如当我们根据同⼀个源文件要编译出⼀个程序的不同版本的时候这个特性有点用处。假定某个程序中声明了⼀个某个长度的数组如果机器内存有限我们需要⼀个很小的数组但是另外⼀个机器内存大些我们需要⼀个数组能够大些。 #include stdio.h
int main()
{
int array [ARRAY_SIZE];
int i 0;
for(i 0; i ARRAY_SIZE; i )
{
array[i] i;
}
for(i 0; i ARRAY_SIZE; i )
{
printf(%d ,array[i]);
}
printf(\n );
return 0;
} 编译指令 1. //linux 环境演⽰
2.gcc -D ARRAY_SIZE10 programe.c6. 条件编译
在编译⼀个程序的时候我们如果要将⼀条语句一组语句编译或者放弃是很方便的。因为我们有条件编译指令。 比如说 调试性的代码删除可惜保留又碍事所以我们可以选择性的编译。
#include stdio.h
#define __DEBUG__
int main()
{
int i 0;
int arr[10] {0};
for(i0; i10; i)
{
arr[i] i;
#ifdef __DEBUG__
printf(%d\n, arr[i]);//为了观察数组是否赋值成功。
#endif //__DEBUG__
}
return 0;
}
常见的条件编译指令 7. 头文件的被包含的方式 本地文件包含 1. #includefilename 查找策略先在源文件所在目录下查找如果该头文件未找到编译器就像查找库函数头文件⼀样在标准位置查找头文件。如果找不到就提示编译错误。 Linux环境的标准头文件的路径 1 /usr/include VS环境的标准头文件的路径 1. C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include
2. //这是VS2022的默认路径 注意按照自己的安装路径去找。 库文件包含 1. #includefilename 查找头文件直接去标准路径下去查找如果找不到就提示编译错误。 这样是不是可以说对于库文件也可以使用“” 的形式包含 答案是肯定的可以但是这样做查找的效率就低些当然这样也不容易区分是库文件还是本地文件了。 8.嵌套文件包含 我们已经知道 #include 指令可以使另外⼀个文件被编译。就像它实际出现于 #include 指令的 地方一样。 这种替换的方式很简单预处理器先删除这条指令并用包含文件的内容替换。 一个头文件被包含10次那就实际被编译10次如果重复包含对编译的压力就比较大。 如果直接这样写test.c文件中将test.h包含5次那么test.h文件的内容将会被拷贝5份在test.c中。 如果test.h文件比较大这样预处理后代码量会剧增。如果⼯程比较大有公共使用的头文件被大家都能使用又不做任何的处理那么后果真的不堪设想。 如何解决头文件被重复引入的问题答案条件编译。 每个头文件的开头写 1. #ifndef __TEST_H__
2. #define __TEST_H__
3. //头⽂件的内容
4. #endif //__TEST_H__ 或者 1. #pragma once 就可以避免头文件的重复引入~ 9. 其他预处理指令
除了以上介绍的预处理指令还有其他的一些~
1. #error
2. #pragma
3. #line
10. 完结散花
好了这期的分享到这里就结束了~
如果这篇博客对你有帮助的话可以用你们的小手指点一个免费的赞并收藏起来哟~
如果期待博主下期内容的话可以点点关注避免找不到我了呢~
我们下期不见不散~~