我正在探索从 bash shell 编译/运行简单的 C++ 程序(在 Ubuntu 12.04 中)。由于我是 Linux 新手,我实际上有几个问题。
首先,Ubuntu/Linux 似乎不像 Windows 那样显示 .abc 格式的文件类型。我知道操作系统不需要该扩展名来了解文件的类型,但让人类用户一眼就能读出这些信息不是更方便吗?我怎么知道给定文件的类型呢?
其次(相关),如果 Linux 似乎并不关心使用类型信息扩展文件名,那么为什么当我在 gedit 中创建一个简单的 C++ 程序并将其命名为“test”时,编译不起作用(顺便说一下,使用 g++ 编译器),但是当我将文件命名为“test.cpp”时,它却能工作?
Linux 是否需要/关心扩展?我觉得我在这里得到了混乱的信息,我真的很想了解一下。
答案1
你不需要有用特定后缀命名文件,但是 gcc/g++ 编译器使用后缀作为决定如何处理文件的快捷方式。如果您想使用不同的后缀(或不使用后缀),您可以使用命令行选项明确告诉编译器它是什么类型的文件-x
- 请参阅此类似上一个问题的答案编译不带 .c 后缀的 C 源文件
答案2
在任何操作系统中,您说的都是正确的:文件的扩展名不能决定文件的类型。扩展名用于告诉程序(和人类)文件的类型。通常,没有扩展名的文件是二进制文件,但这并不是严格的规则。
文件是否有扩展名重要吗?这取决于程序。有些程序(如 OpenOffice 或 Gedit)不会询问有关文件扩展名的任何问题,但无论发生什么错误,都会打开文件。更智能的程序(如 g++)会在解析之前检查文件扩展名,以防止人为错误。还有一些程序(如媒体播放器)相信您会使用正确的文件扩展名,并使用扩展名来确定如何运行。
总之,你可以说 Linux 不太关心文件扩展名。这就让人类和程序自行决定如何命名文件。扩展名有其用处,但它们并不是文件的决定因素。
答案3
人类用户是否能够一眼就读出这些信息?
请记住,Linux 是一个类 Unix 操作系统。自古以来,*nix 就使用不同的方法来识别文件的内容,例如file
,shebang、magic bit 等。UNIX/Linux 的发展就像 Windows 的传承一样,就像 DOS、CP/M。因此,扩展对大多数 Linux 实用程序和工具来说通常不那么重要。
我怎么知道给定文件的类型?
你让系统告诉你。为此,file
大多数(如果不是全部)文件管理器都使用魔法位来识别文件的内容。
如果 Linux 似乎并不关心使用类型信息扩展文件名,那么为什么当我在 gedit 中创建一个简单的 C++ 程序并将其命名为“test”时,编译不起作用(顺便说一下,使用 g++ 编译器),但是当我将文件命名为“test.cpp”时,它却能正常工作?
这是为了便于移植,因为它们从一开始就是这样的。由于 Linux 不关心扩展名,而 Windows 关心,因此它们使两个操作系统都能识别文件的内容。
答案4
Unix 的设计理念是让文件、描述符、权限、管道、链接和程序等相互交互。人们认为程序员会正确地完成这些工作。因此,Unix 的整个 Linux 分支都基于相同的理念构建,而不是使用严格的类型扩展作为系统组织的基础。用于构建 Unix 的早期 C 编译器恰好具有文件扩展名,以便更轻松地与对象、源和编译文件进行交互。因此,它们一直沿用至今。
Windows 不使用类型扩展来帮助人类用户,但因为它使用的结构灵活性不够。
最后,gnu/linux/ubuntu 也是必需的学习经历,你应该对它们与 Windows 之间的差异持积极态度,因为你真正要通过这样做来了解计算机是如何工作的。