C++ 是'#包括「;文件2.c“';不同于';gcc文件1.c文件2.c';?

C++ 是'#包括「;文件2.c“';不同于';gcc文件1.c文件2.c';?,c++,c,compilation,linker,C++,C,Compilation,Linker,如果您不打算单独重新编译包含的文件,是否有任何理由选择链接器命令而不是包含指令 如果它是重要的,我实际上是关注C++和g++的,但是我认为GCC会更像一个通用编译器。 有什么理由更喜欢链接器命令而不是include指令吗 对。如果到处都包含实现(.c)文件,您将陷入严重的麻烦。遇到臭名昭著的“符号的多个定义_MyFunc”链接器错误 (顺便说一句,这也被认为是不好的风格/做法,通常只包括头文件。)如果您真的想要一个长的C文件,请使用编辑器将file2.C插入file1.C,然后删除file2.C

如果您不打算单独重新编译包含的文件,是否有任何理由选择链接器命令而不是包含指令

如果它是重要的,我实际上是关注C++和g++的,但是我认为GCC会更像一个通用编译器。 有什么理由更喜欢链接器命令而不是include指令吗

对。如果到处都包含实现(
.c
)文件,您将陷入严重的麻烦。遇到臭名昭著的“符号的多个定义_MyFunc”链接器错误


(顺便说一句,这也被认为是不好的风格/做法,通常只包括头文件。)

如果您真的想要一个长的C文件,请使用编辑器将file2.C插入file1.C,然后删除file2.C。如果他们总是在一起,那么这(可能)就是正确的解决方案。为此使用#include不是正确的解决方案


我们将文件拆分为单独的.c和.cpp文件的原因是,它们在逻辑上与代码的其余部分不同。当程序较大时,单独编译每个单元是一个好主意,但将内容拆分为单独文件的主要原因是为了显示每个代码单元的独立性。通过这种方式,您可以查看影响此特定文件的其他部分(查看包含的标题)。如果一个类是.cpp文件的本地类,那么您知道该类在系统中的其他地方没有使用,因此您可以安全地更改该类的内部结构,而不必担心其他组件受到影响,例如。另一方面,如果所有内容都在一个大文件中,那么很难了解哪些内容会影响哪些内容,哪些内容可以安全地更改

区别就在这里<代码>文件1.c:

#include <stdio.h>
static int foo = 37;
int main() { printf("%d\n", foo); }
static int foo = 42;
这两个简单的模块可以通过
gcc file1.c file2.c
很好地编译,即使
file2.c
foo
的定义从未使用过<代码>静态标识符仅在翻译单元(通常称为模块的C版本)内可见

当您在
file1.c
中包含“file2.c”时,您会有效地将
file2.c
插入
file1.c
,导致两个文件在成为一个翻译单元之前发生标识符冲突


通常,绝不>代码>包含.<代码> C或C++源文件。只有

#包含
标题。

@CoryNelson是的,这会导致更多的混淆,例如,如果您有两个同名的静态函数。。。