C_01_include文件有什么妙用

这篇具有很好参考价值的文章主要介绍了C_01_include文件有什么妙用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

最近在看代码的过程中,发现一种新玩法,就是在一个*.c文件中,直接include另一个 *.c 文件,以往都是include一个 *.h文件。这个脑洞大开,神奇!随之而来的有两个问题:

Q1. 这么写代码有什么效果?

Q2. 想知道原作者为什么这么写代码 ?

这么写代码有什么效果?

先来看第一个问题,这么写代码有什么效果,准备两个源文件如下:

.
├── driver.c
└── main.c

driver.c 文件内容如下:

void readDriver(void)
{
    int i = 0;
    i++;
}

main.c 文件内容如下:

#include "driver.c"
int main(void)
{
    readDriver();
    return 0;
}

运行以下gcc命令,获取宏定义,include文件展开后的效果

root@localhost:~/testWorkSpace/C/include$ gcc -E -P main.c
void readDriver(void)
{
    int i = 0;
    i++;
}
int main(void)
{
    readDriver();
    return 0;
}

从实验结果可知,“main.c”文件中#include "driver.c"语句,相当于将文件“driver.c”的内容完全”复制“到了main.c文件中。

  • 限制

使用此种方式有上述优点,还有一个限制,就是两个文件不能同时参加编译,否则,会在链接过程中,出现函数多处定义的错误,造成链接失败。原因显而易见,函数”readDriver()"在两个文件中定义了两次。

root@localhost:~/testWorkSpace/C/include$ cmake --build ./build/
Scanning dependencies of target include
[ 33%] Building C object CMakeFiles/include.dir/main.c.o
[ 66%] Building C object CMakeFiles/include.dir/driver.c.o
[100%] Linking C executable include
CMakeFiles/include.dir/driver.c.o: In function `readDriver':
driver.c:(.text+0x0): multiple definition of `readDriver'
CMakeFiles/include.dir/main.c.o:main.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
CMakeFiles/include.dir/build.make:98: recipe for target 'include' failed
make[2]: *** [include] Error 1
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/include.dir/all' failed
make[1]: *** [CMakeFiles/include.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

为什么这么写

从网上找了一些相关的资料,目前,知道这么写有以下优点:

  • 控制源文件编译

需要某个功能,在源文件中包含相关的源文件。

  • 单元测试

在测试代码文件中直接引入目标测试函数,而非到链接阶段,才引入目标测试函数。文章来源地址https://www.toymoban.com/news/detail-823849.html

到了这里,关于C_01_include文件有什么妙用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【初阶C语言】指针的妙用

    前言:在C语言中,有一个非常重要的知识点,叫做指针,指针也是数据类型中的一种。在本节内容中,我们就一起来学习指针。  学习一个新知识的时候,我们需要从这几个方面: 指针是什么,指针是怎么访问数据(指针是怎么工作的),也就是弄清楚指针类型的作用,怎

    2024年02月14日
    浏览(36)
  • C语言-print字符串打印-转义字符妙用

    这里有两个有关打印的小知识 打印的字符串内容由两部分组成: 可见字符、转义字符 ;各种字母、数字、以及空格,均属于可见字符,“”等属于转义字符 举例: 1.直接print里面打印内容,内容直接出现 2.这里想将一行字符串拆开来展示,直接打印行不通 3.这里要用到转义

    2024年02月16日
    浏览(74)
  • 文件上传-.user.ini的妙用

            小伙伴们大家好!本期为大家带来的是.user.ini在文件上传漏洞中的妙用。 目录 .user.ini .user.ini的妙用原理 利用.user.ini的环境 实战演示 ​1、先尝试直接上传webshell 2、看是否能够上传除php和png外的文件 3、上传.user.ini文件 4、再次尝试上传webshell 5、测试上传的.use

    2024年02月07日
    浏览(44)
  • C++ 中到底是应该include .h文件还是应该include .cpp文件

    在阅读一个较大的解决方案中,对于其他文件夹下的.h和.cpp文件,有时候#include“XXX.h”文件,有时候是#include“XXX.cpp”文件,而且二者还不能更换。下面就好好分析一下他们二者的区别。          如果 .h 文件和 .cpp 文件都已经添加在解决方案里,只要在 main 的头文件中

    2024年02月05日
    浏览(50)
  • 深入探索Linux文件链接技术:ln命令的妙用

    当谈及 Linux 系统中的文件管理和链接技术,ln 命令是一个不可或缺的工具。ln 命令用于创建硬链接和软链接,它在 Linux 文件系统中发挥着重要作用,为用户提供了更大的灵活性和组织能力。在本文中,我们将深入探讨 ln 命令是什么,以及如何使用它来创建链接,以提高文件

    2024年02月13日
    浏览(40)
  • 文件的加密与解密——Openssl的妙用:安装与使用案例

    Openssl应用——文件加解密 1. 加密简介 1.1 加密类型 1.1.1 对称加密(或者叫密钥加密) 使用一摸一样的密钥进行加解密; 优点 :加解密速度快; 1.1.2 非对称加密(或者叫公钥加密) 使用不相同的密钥进行加解密; 优点 :安全; 公钥加密有2组密钥:公钥和私钥。二者被称

    2024年03月11日
    浏览(36)
  • C语言中关于#include的一些小知识

    写代码的过程中,因为手误,重复包含了头文件 可以看到没有报错 如果是你自己编写的头文件,那么如果没加唯一包含标识的话,那么编译器会编译报错的。如果是系统自带的头文件,由于其每个头文件都加了特殊标识,所以即使你包含两遍,也不会有问题。 在C语言中,如

    2024年02月21日
    浏览(36)
  • #include <graphics.h> #include <conio.h> #include<stdlib.h>无法打开源文件解决方案

    学习数据结构链表的过程中,在编写漫天星星闪烁的代码时,遇到了如下图所示的报错, #include graphics.h 、 #include conio.h 等无法打开源文件。 并且主程序中initgraph(初始化画布)、setfillcolor(颜色填充)loadimage(加载图片)等都出现报错,在网上查找资料后最终解决方案如下:

    2024年02月10日
    浏览(48)
  • Go语言结构体struct详解,Go空结构体的这些妙用你知道吗?

    本文详解了Go语言结构体的各个知识点,最后介绍了空结构体的3种妙用。希望对你有帮助。 结构体,是一种自定义的数据类型,由多个数据类型组合而成。用于描述一类事物相关属性 。 定义方式 : 结构体和结构体指针,两者的实例化有所区别 提供多种写法,灵活使用:

    2024年02月01日
    浏览(47)
  • 详解C语言中的#include <stdio.h>

    #include stdio.h 是C语言中的一个预处理指令,它告诉C编译器在编译时包含 stdio.h 头文件。 stdio.h 是C标准库(Standard Library)中的一个头文件,它提供了输入和输出的函数和宏定义。通过包含 stdio.h 头文件,您可以使用标准输入输出函数(如 printf 和 scanf )来进行屏幕输入和输出

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包