相关疑难解决方法(0)

为什么不在编译之前连接C源文件?

我来自脚本背景,C中的预处理器对我来说总是很难看.然而,当我学习编写小型C程序时,我已经接受了它.我只是真的使用预处理器来包含我为自己的函数编写的标准库和头文件.

我的问题是为什么C程序员不会跳过所有包含并简单地连接他们的C源文件然后编译它?如果将所有包含放在一个位置,则只需要定义一次所需内容,而不是在所有源文件中定义.

这是我所描述的一个例子.这里我有三个文件:

// includes.c
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)
// main.c
int main() {
    foo();
    printf("world\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
// foo.c
void foo() {
    printf("Hello ");
}
Run Code Online (Sandbox Code Playgroud)

通过cat *.c > to_compile.c && gcc -o myprogram to_compile.c在我的Makefile中执行某些操作,我可以减少我编写的代码量.

这意味着我不必为我创建的每个函数编写头文件(因为它们已经在主源文件中),这也意味着我不必在我创建的每个文件中包含标准库.这对我来说似乎是一个好主意!

但是我意识到C是一种非常成熟的编程语言,我想象的是比我聪明的其他人已经有了这个想法,并决定不使用它.为什么不?

c compilation c-preprocessor

74
推荐指数
8
解决办法
8598
查看次数

标题是否存在而不是文件?

C:The Complete Reference中,Herbert Schildt说

标头通常是文件,但它们不一定是文件.编译器允许在内部预定义标头的内容.但是,出于所有实际目的,标准c头文件包含在与其名称对应的文件中.

如何在不成为文件的情况下存在标题?这篇文章的主题是什么?因为.h文件扩展名与标题一起使用.

c header-files

10
推荐指数
1
解决办法
189
查看次数

GCC和预编译头

在阅读了这篇精彩的文章(预编译标题的关注和喂养)之后,我对这些文章在现实生活中如何实际起作用存在疑问.更具体地说,我怎么知道在以下场景中我需要触发预编译头的重建:

  • 我决定#define在我的一个.cpp文件中改变预处理器解释已经包含在我的预编译头中的一些头的方式
  • 我在我的一个.cpp文件中包含另一个标题,该标题#define是特定的预处理器指令,它改变了预处理器解释已经包含在预编译头中的标头的方式
  • 更糟糕的是,当某些标头#include其他标头时,前一个问题可以递归发生

是否应该使用预编译的头文件强制执行某种限制性编码样式,例如将.cpp文件中包含的头文件数限制为一个并且永远不会将#define内容限制在.cpp文件中?

虽然微软的编译器可能在预先编译的头文件中做了不错的工作(通过应用一些特定于MS的voodoo),因为据我所知,它提供了应该做所有管道的选项/Yc/Yu选项,对于GCC来说,似乎这个功能需要Makefile中的大量手动工作和创造力,我无法找到应该解决使用预编译头文件的所有陷阱的模板.

例如,如果我有一个构建多个库的项目,为了在每次更改后不重建所有库,我必须在Makefile中使用一些非常可爱的sed技巧来检测#include当前库中的一个头文件是否被修改(或者它#include是一个修改过的标题).我担心甚至会想到预先构建的头文件实际上意味着的复杂性,以便构建脚本在每次必要时重建它们.

c++ dependencies gcc precompiled-headers

5
推荐指数
1
解决办法
6355
查看次数