【问题标题】:Can i have multiple C source files in the same project (Visual Studio 19)?我可以在同一个项目(Visual Studio 19)中有多个 C 源文件吗?
【发布时间】:2019-11-27 15:21:23
【问题描述】:

这里是初学者。我在 C atm 中编码。所以我刚刚开始使用 VS 2019。一路上遇到了一些麻烦,但我遇到了 LNK 2005 和 LNK 1169 的构建错误。结果我不能在同一个项目中有多个文件。特别是如果我在文件中使用相同的标题。在这种情况下,它是 stdio.h 和 math.h。我多次重新创建了这个。只有当项目中存在一个文件时,代码才能顺利编译。或者至少只有一个具有该特定标头的文件。这几乎阻止了我在同一个项目下拥有多个 C 源文件。那么有什么方法可以在同一个项目中拥有多个文件而不会出现这些错误。

有点烦人,我不能有多个具有相同标题的文件,这显然是不可能的原因,我必须在任何地方使用 stdio.h。 enter image description here

【问题讨论】:

  • 你有多个main()函数吗?请在问题中发布编译器输出消息。没有理由每个源文件不能#include 相同的库头文件:它们有“头文件保护”来允许它。
  • 这很不寻常,您的代码可能有问题,但我们无法告诉您如何在没有看到您的代码和您收到的确切错误消息的情况下修复它
  • 我在这里打开了指向错误的链接。 docs.microsoft.com/en-us/cpp/error-messages/tool-errors/… 根据这个页面,我不能在多个文件中的同一个项目中拥有 sam 标头。我通过删除其他文件或使用 // 将这些标题变成 cmets 来测试这一点。它编译没有任何问题。
  • 我会添加图片以防万一
  • 你不能在两个文件中都有main

标签: c visual-studio project


【解决方案1】:

本质上,解决方案是一个用于包含多个项目的容器,您可以选择编译整个解决方案(即解决方案中的所有项目),或者所述解决方案中的单个项目。

每个项目只能有 1 个main(),否则您的操作系统将不知道从哪里开始执行,当然您可以在同一个项目中拥有多个源文件,否则对于更小的项目,您将拥有一个文件大量的行。 这种结构在许多 IDE 中很常见(可能名称与 ProjectSolution 不同,这只是 VS 使用的命名法),它并没有真正绑定到 Windows 或 Linux。

尝试在 Linux 上拥有多个带有多个 main() 的源文件,然后尝试与 gcc 一起编译,你会看到你得到一个非常相似的错误。

您也不能在多个文件中拥有相同的函数定义,否则您会收到您所看到的 LNK 2005 链接器错误。这是因为当链接器在链接您的文件时,如果它发现两个相同的定义,它不知道该采用哪一个并发疯。

但是如何在不同的源中包含相同的头文件呢?

这就是为什么.h 文件有包含保护,它们确保.h 文件的内容在每次编译中只被链接器包含一次。

通常在头文件中有两种可能的方法之一来包含这些守卫,这两种方法之间存在非常小的差异,但如果你不做一些非常具体的事情,它们就不会真正适用:

 #pragma once
 // Content of the header

#ifndef GUARD_H
#define GUARD_H

// Content of header

#endif

每个.h 文件的GUARD_H 应该不同,通常它是您的项目和头文件名称的组合,只是为了确保它与其他头文件中可能存在的其他保护不同。

这也是为什么您不能(也不应该)在代码中包含源文件的原因,如果您包含源文件,那么您很可能会多次包含相同的定义,因为它们不使用包含警卫。

C 文件正常存储在您想要的任何文件夹中,并在终端中使用 gcc 和 ./a.out 进行编译

这基本上就是 VS 所做的,只是您无需选择在编译中添加哪些文件,VS 会自动获取同一解决方案或项目中的所有文件(取决于您决定构建哪个文件)。

为方便起见,如果您刚刚开始学习,请为您想要的每个项目(因此为每个main())创建一个新的解决方案。

这比使用简单的文本编辑器好还是坏?好吧,在最初 10-15 分钟的学习之后,您会发现使用实际的 IDE 会更快、更有用,因为它提供了许多功能,可以让您更快地编写代码并减少错误。

这是对一般情况下如何工作的非常快速的解释。如果可以,请尝试找到可以向您解释这些事情的 IRL。在互联网上真的很难解释,但在同一台电脑前在一起不到 10 分钟。

【讨论】:

  • 在 Ubuntu 中,我写了一个 C 程序,保存它。然后我输入 gcc filename.c 然后输入 ./a.out 以获得所需的输出。我知道 Visual Studio 更好,但我是初学者的事实确实表明,因为与我必须输入的 2 行简单的行相比,我发现 VS 很乏味以获得输出。另一件事,有这个问题,它 VS 不执行我想要的项目,而是每次都执行另一个项目。我在同一个解决方案下有多个项目,但我最终放弃了,因为它无法编译我想要的
  • 似乎还有其他问题,如scanf被忽略。我使用 CRT_SECURE_NO_WARNINGS 修复了其中的几个,但这只是我在 VS 中遇到的问题的一小部分。谢谢你的回答。它有帮助
  • 您所指的所有“问题”实际上都是 VS 为使您的代码更安全或让您开发更快/更好的代码而设置的东西(例如不使用 scanf 这不是推荐用于number of reasons)。正如我所说,尝试找一个可以实时向您解释正在发生的事情的 IRL。只需几分钟,让您的开发体验更好
  • 我并不是说 VS 是所有 IDE 的终极目标,但您现在面临的大部分问题都会出现在几乎所有其他 IDE 中
  • 真的很抱歉 2 个月后再次打扰您。但是您提到“这也是为什么您不能(也不应该)在代码中包含源文件的原因,如果您包含源文件,那么您很有可能多次包含相同的定义,因为它们不使用包括警卫。”我没听懂。
猜你喜欢
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 2015-12-09
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多