为什么要从命令行编译C ++程序,为什么必须命名我的文本文件 .cpp?

我正在探索从bash shell编译/运行简单的C ++程序(在Ubuntu 12.04中)。 作为一般的Linux新手,我实际上有几个问题。

首先,似乎Ubuntu / Linux不像Windows那样以.abc格式显示文件类型。 我知道操作系统不需要那个扩展来知道文件的类型,但是人类用户能够一目了然地读取这些信息更方便吗? 我怎么知道给定文件的类型是什么?

第二个(相关地),如果Linux似乎不关心使用类型信息扩展文件名,为什么当我在gedit中创建一个简单的C ++程序并且只是称它为’test’时,编译不起作用(使用g ++编译器btw),但是当我命名文件’test.cpp’时,它确实有用吗?

Linux是否需要/关心扩展? 我觉得我在这里收到混合信息,我真的很想了解。

您不必使用特定后缀命名文件,但gcc / g ++编译器使用后缀作为快捷方式来决定如何处理文件。 如果你想使用不同的后缀(或没有后缀),你可以告诉编译器它使用-x命令行选项明确显示哪种文件 – 请参阅此类似的先前问题的答案编译没有.c suffic的C源文件

在任何操作系统中,您所说的都是正确的:文件的扩展名不能确定文件的类型。 扩展用于告诉程序(和人类)对文件类型的期望。 通常,没有扩展名的文件是二进制文件,但这不是严格的规则。

文件是否有扩展名是否重要? 这取决于该计划。 有些人,比如OpenOffice或Gedit,不会询问有关文件扩展名的任何问题,但无论发生什么错误,都会打开文件。 像g ++这样的更智能的程序将在解析之前检查文件扩展名以防止出现人为错误。 然后有媒体播放器等程序信任您使用文件的正确扩展名并使用扩展名来确定如何运行。

总而言之,您可以说Linux并不关心文件扩展名。 这使得人类和程序能够做出有关命名文件的明智决策。 扩展有它们的位置,但它们不是文件内容的决定因素。

人类用户能够一目了然地读取这些信息吗?

请记住,Linux是类Unix操作系统。 自古以来,* nix使用不同的方法来识别文件的内容,如file ,shebang,魔术位等.UNIX / Linux开发为DOS,CP / M,Windows遗产。 因此,对于大多数Linux实用程序和工具,扩展通常不太重要。

我怎么知道给定文件的类型是什么?

你要求系统告诉你。 为此,它是file ,大多数(如果不是全部)文件管理器使用魔术位来识别文件的内容。

如果Linux似乎不关心使用类型信息扩展文件名,那么为什么当我在gedit中创建一个简单的C ++程序并将其称为’test’时,编译不起作用(使用g ++编译器btw),但是当我将文件命名为’test.cpp’时,它确实有用吗?

这是为了便携性,因为它们就像是从开始的那样。 由于Linux并不关心扩展,但Windows确实如此,因此它们使两个操作系统都能识别文件的内容。

Unix是在文件,描述符,权限,管道,链接和程序等相互交互的基础上创建的。 假设程序员会做得对。 所以Unix的整个linux分支都建立在同一个想法上,而不是用作系统组织基础的严格类型扩展。 事实恰恰相反,用于构建unix的早期c编译器具有文件扩展名,以便更容易使用与对象,源代码和编译文件的交互。 所以他们卡住了。

Windows不使用类型扩展来帮助人类用户,但因为它使用的结构灵活性差得多。

最后,gnu / linux / ubuntu也在学习必要的经验,你应该对它们与Windows之间的差异持积极的态度,因为你真的要通过这样做来学习计算机是如何工作的。