我可以在同一个项目中有多个 C 源文件吗 (Visual Studio 19)?
Can i have multiple C source files in the same project (Visual Studio 19)?
这里是初学者。我用 C atm 编码。所以我刚开始使用 VS 2019。一路上遇到了一些麻烦,但我遇到了构建错误以及 LNK 2005 和 LNK 1169。事实证明我不能在同一个项目中有多个文件。特别是如果我在文件中使用相同的 header。在本例中是 stdio.h 和 math.h。我多次重新创建了这个。仅当项目中存在一个文件时,代码才能顺利编译。或者至少只有一个包含该特定 header 的文件。这几乎阻止了我在同一项目下拥有多个 C 源文件。那么有没有办法在同一个项目中拥有多个文件而不会出现这些错误。
我不能让多个文件具有相同的 header 有点烦人,这显然是不可能的,我必须在任何地方都使用 stdio.h。 enter image description here
本质上,一个解决方案是一个容器,用于包含多个项目,您可以选择编译整个解决方案(因此所有解决方案中的项目),或所述解决方案中的单个项目。
每个项目只能有 1 个 main()
,否则你的 OS 将不知道从哪里开始执行,当然你可以在同一个项目中有多个源文件,否则对于更小的项目您将拥有一个包含大量行的文件。
这种结构在许多 IDE 中很常见(可能与 Project 和 Solution[=55 的名称不同=],这只是 VS 使用的命名法),它并没有真正绑定到 Windows 或 Linux。
尝试 Linux 使多个源文件具有多个 main()
并尝试与 gcc
一起编译,您会发现您得到一个非常相似的错误。
你也不能在多个文件中有相同的函数定义,否则你会得到你看到的 LNK 2005 链接器错误。这是因为当链接器链接你的文件时,如果它发现两个相同的定义,它不知道该接受哪一个并且会发疯。
But then how do you include the same header files in different sources?
这就是为什么 .h
文件有 include guards,它们确保 .h
文件的内容在每个文件中只被链接器包含一次编译.
通常在头文件中有两种可能的方法之一来包含这些守卫,这两种方法之间的差异非常小,但如果你没有做一些非常具体的事情,它们并不适用:
#pragma once
// Content of the header
或
#ifndef GUARD_H
#define GUARD_H
// Content of header
#endif
每个 .h
文件的 GUARD_H
应该不同,通常它是您的项目和头文件名称的组合,只是为了确保它与其他头文件中可能存在的其他守卫不同。
这也是为什么您不能(也不应该)在代码中包含源文件的原因,如果您包含一个源文件,那么您很可能会多次包含相同的定义,因为它们不会使用包括守卫。
The C file gets stored normally in any folder you want and gets compiled with a gcc and ./a.out in the terminal
这基本上就是 VS 所做的,只是您不必选择要在编译中添加哪些文件,VS 会自动获取同一解决方案或项目中的所有文件(取决于您决定构建哪个文件)。
为方便起见,如果您刚刚开始学习,请为您想要的每个项目(也就是每个 main()
)创建一个新解决方案。
这比使用简单的文本编辑器好还是坏?好吧,在最初的 10-15 分钟学习之后,您会发现使用实际的 IDE 会更快也更有用,因为它提供了许多功能,可以让您更快地编写代码并减少错误。
这是对事物一般运作方式的快速解释。如果可以,请尝试找到可以向您解释这些事情的 IRL。在互联网上真的很难解释,但在同一台电脑前在一起用不到 10 分钟。
这里是初学者。我用 C atm 编码。所以我刚开始使用 VS 2019。一路上遇到了一些麻烦,但我遇到了构建错误以及 LNK 2005 和 LNK 1169。事实证明我不能在同一个项目中有多个文件。特别是如果我在文件中使用相同的 header。在本例中是 stdio.h 和 math.h。我多次重新创建了这个。仅当项目中存在一个文件时,代码才能顺利编译。或者至少只有一个包含该特定 header 的文件。这几乎阻止了我在同一项目下拥有多个 C 源文件。那么有没有办法在同一个项目中拥有多个文件而不会出现这些错误。
我不能让多个文件具有相同的 header 有点烦人,这显然是不可能的,我必须在任何地方都使用 stdio.h。 enter image description here
本质上,一个解决方案是一个容器,用于包含多个项目,您可以选择编译整个解决方案(因此所有解决方案中的项目),或所述解决方案中的单个项目。
每个项目只能有 1 个 main()
,否则你的 OS 将不知道从哪里开始执行,当然你可以在同一个项目中有多个源文件,否则对于更小的项目您将拥有一个包含大量行的文件。
这种结构在许多 IDE 中很常见(可能与 Project 和 Solution[=55 的名称不同=],这只是 VS 使用的命名法),它并没有真正绑定到 Windows 或 Linux。
尝试 Linux 使多个源文件具有多个 main()
并尝试与 gcc
一起编译,您会发现您得到一个非常相似的错误。
你也不能在多个文件中有相同的函数定义,否则你会得到你看到的 LNK 2005 链接器错误。这是因为当链接器链接你的文件时,如果它发现两个相同的定义,它不知道该接受哪一个并且会发疯。
But then how do you include the same header files in different sources?
这就是为什么 .h
文件有 include guards,它们确保 .h
文件的内容在每个文件中只被链接器包含一次编译.
通常在头文件中有两种可能的方法之一来包含这些守卫,这两种方法之间的差异非常小,但如果你没有做一些非常具体的事情,它们并不适用:
#pragma once
// Content of the header
或
#ifndef GUARD_H
#define GUARD_H
// Content of header
#endif
每个 .h
文件的 GUARD_H
应该不同,通常它是您的项目和头文件名称的组合,只是为了确保它与其他头文件中可能存在的其他守卫不同。
这也是为什么您不能(也不应该)在代码中包含源文件的原因,如果您包含一个源文件,那么您很可能会多次包含相同的定义,因为它们不会使用包括守卫。
The C file gets stored normally in any folder you want and gets compiled with a gcc and ./a.out in the terminal
这基本上就是 VS 所做的,只是您不必选择要在编译中添加哪些文件,VS 会自动获取同一解决方案或项目中的所有文件(取决于您决定构建哪个文件)。
为方便起见,如果您刚刚开始学习,请为您想要的每个项目(也就是每个 main()
)创建一个新解决方案。
这比使用简单的文本编辑器好还是坏?好吧,在最初的 10-15 分钟学习之后,您会发现使用实际的 IDE 会更快也更有用,因为它提供了许多功能,可以让您更快地编写代码并减少错误。
这是对事物一般运作方式的快速解释。如果可以,请尝试找到可以向您解释这些事情的 IRL。在互联网上真的很难解释,但在同一台电脑前在一起用不到 10 分钟。