"包括*.c文件"式C编程可能存在缺陷

viv*_*mar 3 c

我通过以下方式遇到了一些代码

//file.c  
#include <stdlib.h>

void print(void){

    printf("Hello world\n");
}
Run Code Online (Sandbox Code Playgroud)

//file main.c  
#include <stdio.h>
#include "file.c"

int main(int argc, char *argv[]){

    print();

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

这种编程风格有什么缺陷吗?虽然我感觉如此,但我无法弄清楚这个缺陷,因为在某处我读到将实现分离为*.h和*.c文件有助于编译器检查一致性.我不明白一致性是什么意思.
我会非常感谢一些建议.

- 谢谢

Kse*_*pac 9

没有什么能阻止你包含.c文件.但是,分隔声明(在.h文件中)和实现(和.c文件)然后仅包含.h文件有几个优点:

  • 编译时间.您的声明通常变化少于您的实施.如果仅包含.h文件,并对实现进行更改(在.c文件中),则只需重新编译一个.c文件,而不是包含修改后文件的所有文件.

  • 接口的可读性和管理.您可以一目了然地查看(通常)小.h文件中的所有声明,而.c文件中填充了行和代码行.此外,它可以帮助您确定哪个文件查看哪些函数和变量.例如,避免将全局变量包含在您不想要的位置.


Meh*_*ari 9

编译器应编译.c文件是一种常见的期望..h文件不直接提供给编译器.它们通常只包含在.c文件中.

因此,您的代码应该通过以下方式编译:

gcc main.c file.c 
Run Code Online (Sandbox Code Playgroud)

而不仅仅是gcc main.c.该命令在链接阶段将失败,因为它看到重复的符号.


Bri*_*new 6

如果将file.c包含在多个源代码文件中并组成库/可执行文件,则会遇到问题,因为您将有重复的方法实现.上述内容让我感到很难分享/重用代码,不建议使用.