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

为什么这么写

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

  • 控制源文件编译

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

  • 单元测试

在测试代码文件中直接引入目标测试函数,而非到链接阶段,才引入目标测试函数。

相关推荐

  1. C_01_include文件什么

    2024-01-25 12:04:02       33 阅读
  2. Rust:文件 launch.json 什么

    2024-01-25 12:04:02       11 阅读
  3. C语言】(25)文件包含include

    2024-01-25 12:04:02       28 阅读
  4. C++中的接口什么

    2024-01-25 12:04:02       42 阅读
  5. C++ inline 关键字什么

    2024-01-25 12:04:02       32 阅读
  6. mybatis xml 文件 sql include

    2024-01-25 12:04:02       39 阅读
  7. linux Shell 命令行-08-file include 文件包含

    2024-01-25 12:04:02       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-25 12:04:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-25 12:04:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-25 12:04:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-25 12:04:02       20 阅读

热门阅读

  1. dos 下查看磁盘信息

    2024-01-25 12:04:02       38 阅读
  2. google-webrtc 原理

    2024-01-25 12:04:02       39 阅读
  3. Spark累加器LongAccumulator

    2024-01-25 12:04:02       33 阅读
  4. 【笔记】Helm-4 最佳实践-依赖

    2024-01-25 12:04:02       35 阅读
  5. harmonyOS app 开发环境配置流程

    2024-01-25 12:04:02       32 阅读