【维生素C语言】第十七章 - C语言预处理(下)_总程序自定义comm

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文



> 
> 🚩 运行结果:1 2 3 4 5 6 7 8 9 10
> 
> 
> 


❗  如果不想用了,就把 #define \_\_DEBUG\_\_ 注释掉:



#include <stdio.h>

// #define DEBUG // 关

int main(void)
{
int arr[10] = {0};
int i = 0;
for (i = 0; i < 10; i++) {
arr[i] = i;
#ifdef DEBUG // 此时ifdef为假
printf("%d ", arr[i]);
#endif
}

return 0;

}



> 
> 🚩 (代码成功运行)
> 
> 
> 



#### 0x01 条件编译之常量表达式


![](https://img-blog.csdnimg.cn/20210831084820335.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16)


📚 介绍:如果常量表达式为真,参加编译。反之如果为假,则不参加编译。


💬 代码演示:常量表达式为真



#include <stdio.h>

int main(void) {
#if 1
printf(“Hello,World!\n”);
#endif

return 0;

}



> 
>  🚩 运行结果:Hello,World!
> 
> 
> 



💬 代码演示:常量表达式为假



#include <stdio.h>

int main(void) {
#if 0
printf(“Hello,World!\n”);
#endif

return 0;

}



> 
> 🚩 (代码成功运行)
> 
> 
> 



💬 当然也可以用宏替换,可以表示地更清楚:



#include <stdio.h>

#define PRINT 1
#define DONT_PINRT 0

int main(void) {
#if PRINT
printf(“Hello,World!\n”);
#endif

return 0;

}



#### 0x02 多分支的条件编译


![](https://img-blog.csdnimg.cn/2021083109332166.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16)


📚 介绍:多分支的条件编译,直到常量表达式为真时才执行。



💬 代码演示:



#include <stdio.h>

int main(void) {
#if 1 == 2 // 假
printf(“rose\n”);
#elif 2 == 2 // 真
printf(“you jump\n”);
#else
printf(“i jump\n”)
#endif

return 0;

}



> 
> 🚩 代码运行结果:you jump
> 
> 
> 



#### 0x03 条件编译判断是否被定义


![](https://img-blog.csdnimg.cn/20210831104819610.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16)


📚 定义:ifdef 和 if defined() ,ifndef 和 if !defined() 效果是一样的,用来判断是否被定义。



💬 代码演示:



#include <stdio.h>

#define TEST 0
// #define TEST2 // 不定义

int main(void) {
/* 如果TEST定义了,下面参与编译 */
// 1
#ifdef TEST
printf(“1\n”);
#endif

// 2
#if defined(TEST)
printf(“2\n”);
#endif

/* 如果TEST2不定义,下面参与编译 */
// 1
#ifndef TEST2
printf(“3\n”);
#endif

// 2
#if !defined(TEST2)
printf(“4\n”);
#endif

return 0;

}



#### 0x04 条件编译的嵌套


📚 和 **if** 语句一样,是可以嵌套的:



#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次。
> 
> 
> 


#### 0x00 头文件被包含的方式


![](https://img-blog.csdnimg.cn/20210831112916957.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16)


📚  < > 和 " " 包含头文件的本质区别:查找的策略的区别


① " " 的查找策略:先在源文件所在的目录下查找。如果该头文件未找到,则在库函数的头文件目录下查找。(如果仍然找不到,就提示编译错误)


**Linux环境** 标准头文件的路径:



/usr/include


**VS环境** 标准头文件的路径:



C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include



② < > 的查找策略:直接去标准路径下去查找。(如果仍然找不到,就提示编译错误)



❓ 既然如此,那么对于库文件是否也可以使用 " " 包含?


💡 当然可以。但是这样做查找的效率就低些,当然这样也不容易区分是库文件还是本地文件了。为了效率不建议这么做。



💬 代码演示:


①  **add.h**



int Add(int x, int y);


②  **add.c**



int Add(int x, int y) {
return x + y;
}


③  **test.c**



#include <stdio.h>
#include “add.h”

int main(void) {
int a = 10;
int b = 20;
int ret = Add(a, b);
printf(“%d\n”, ret);

return 0;

}



> 
> 🚩 运行结果:30
> 
> 
> 



#### 0x01 嵌套文件的包含


❗  头文件重复引入的情况:


![](https://img-blog.csdnimg.cn/20210831152200654.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> **comm.h** 和 **comm.c** 是公共模块。  
> **test1.h** 和 **test1.c** 使用了公共模块。  
> **test2.h** 和 **test2.c** 使用了公共模块。  


## 学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7a04c5d629f1415a9e35662316578e07.png#pic_center)





**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
![img](https://img-blog.csdnimg.cn/img_convert/912080576a3d46640dbcca94482a068e.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

和掌握的东西就会越来越多以下是网络渗透需要学习的内容:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7a04c5d629f1415a9e35662316578e07.png#pic_center)





**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
[外链图片转存中...(img-BKljqWfb-1713470792438)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#DESCRIPTION:Resource namespaces pidns01 pidns01 pidns02 pidns02 pidns03 pidns03 pidns04 pidns04 pidns05 pidns05 pidns06 pidns06 pidns10 pidns10 pidns12 pidns12 pidns13 pidns13 pidns16 pidns16 pidns17 pidns17 pidns20 pidns20 pidns30 pidns30 pidns31 pidns31 pidns32 pidns32 mqns_01 mqns_01 mqns_01_clone mqns_01 -m clone mqns_01_unshare mqns_01 -m unshare mqns_02 mqns_02 mqns_02_clone mqns_02 -m clone mqns_02_unshare mqns_02 -m unshare mqns_03 mqns_03 mqns_03_clone mqns_03 -clone mqns_04 mqns_04 mqns_04_clone mqns_04 -clone netns_netlink netns_netlink netns_breakns_ip_ipv4_netlink netns_breakns.sh netns_breakns_ip_ipv6_netlink netns_breakns.sh -6 netns_breakns_ip_ipv4_ioctl netns_breakns.sh -I netns_breakns_ip_ipv6_ioctl netns_breakns.sh -6I netns_breakns_ns_exec_ipv4_netlink netns_breakns.sh -e netns_breakns_ns_exec_ipv6_netlink netns_breakns.sh -6e netns_breakns_ns_exec_ipv4_ioctl netns_breakns.sh -eI netns_breakns_ns_exec_ipv6_ioctl netns_breakns.sh -6eI netns_comm_ip_ipv4_netlink netns_comm.sh netns_comm_ip_ipv6_netlink netns_comm.sh -6 netns_comm_ip_ipv4_ioctl netns_comm.sh -I netns_comm_ip_ipv6_ioctl netns_comm.sh -6I netns_comm_ns_exec_ipv4_netlink netns_comm.sh -e netns_comm_ns_exec_ipv6_netlink netns_comm.sh -6e netns_comm_ns_exec_ipv4_ioctl netns_comm.sh -eI netns_comm_ns_exec_ipv6_ioctl netns_comm.sh -6eI netns_sysfs netns_sysfs.sh shmnstest_none shmnstest -m none shmnstest_clone shmnstest -m clone shmnstest_unshare shmnstest -m unshare shmem_2nstest_none shmem_2nstest -m none shmem_2nstest_clone shmem_2nstest -m clone shmem_2nstest_unshare shmem_2nstest -m unshare shm_comm shm_comm mesgq_nstest_none mesgq_nstest -m none mesgq_nstest_clone mesgq_nstest -m clone mesgq_nstest_unshare mesgq_nstest -m unshare msg_comm msg_comm sem_nstest_none sem_nstest -m none sem_nstest_clone sem_nstest -m clone sem_nstest_unshare sem_nstest -m unshare semtest_2ns_none semtest_2ns -m none semtest_2ns_clone semtest_2ns -m clone semtest_2ns_unshare semtest_2ns -m unshare sem_comm sem_comm utsname01 utsname01 utsname02 utsname02 utsname03_clone utsname03 -m clone utsname03_unshare utsname03 -m unshare utsname04_clone utsname04 -m clone utsname04_unshare utsname04 -m unshare mountns01 mountns01 mountns02 mountns02 mountns03 mountns03 mountns04 mountns04 userns01 userns01 userns02 userns02 userns03 userns03 userns04 userns04 userns05 userns05 userns06 userns06 userns07 userns07 userns08 userns08 # time namespaces sysinfo03 sysinfo03 clock_nanosleep03 clock_nanosleep03 clock_gettime03 clock_gettime03 timens01 timens01 timerfd04 timerfd04
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值