使用 c++ 命令而不是 g++ 编译 .cpp 文件 (Linux)

Compiling a .cpp file with c++ command instead of g++ (Linux)

假设我们有一个名为 hello.cpp 的简单 C++ 文件,它打印“Hello World!”。

我们通常使用 g++ hello.cpp 创建可执行文件。当我尝试执行命令 c++ hello.cpp 时,它成功创建了可执行文件。它不应该抛出一个错误,说没有可用的 c++ 命令吗?并建议我们使用 g++?

我在终端上尝试了 运行 man c++,这会打开 GNU C 项目页面。那么,终端是否在内部将我们的c++ hello.cpp替换为g++ hello.cpp?它不应该这样做吗?

附加信息:
同样,如果我有一个打印“Hello World!”的 hello.c 程序。当我在命令行上执行 c hello.c 时,出现错误:

$ c hello.c
c: command not found

这是预料之中的,因为我们必须使用 gcc hello.c。为什么 c++ hello.cpp 没有出现类似的错误?

在我的 Ubuntu 系统上,我看到了这个:

$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 May  6  2019 /usr/bin/c++ -> /etc/alternatives/c++
$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 May  6  2019 /etc/alternatives/c++ -> /usr/bin/g++

所以c++实际上是g++

的别名(符号link)

替代系统允许将编译器 c++ 的别名更改为:

$ update-alternatives --display c++
c++ - auto mode
  link best version is /usr/bin/g++
  link currently points to /usr/bin/g++
  link c++ is /usr/bin/c++
  slave c++.1.gz is /usr/share/man/man1/c++.1.gz
/usr/bin/clang++ - priority 10
/usr/bin/g++ - priority 20
  slave c++.1.gz: /usr/share/man/man1/g++.1.gz

所以 c++ 实际上可以是 g++ 或 clang++

对于 C 编译器,您不需要 c 命令,但是 cc,同样可以是 gcc 或 clang。

我的 CentOS 系统对于 symlinks 不是很明显,但是 g++ --versionc++ --version 给出相同的输出并且都说它们是 g++。然而,cc 是 gcc 那里的直接 symlink。

Shouldn't it throw an error saying there is no c++ command available? and suggest us to use g++?

Weelll,没有任何法规或标准限制或要求 c++ 命令执行任何操作,因此没有“应该”或“不应该”之分。但是,强烈希望 c++ 是一个工作的 C++ 兼容编译器,它支持与 cc 相似或相同的标志。

does the terminal replace our c++ hello.cpp with g++ hello.cpp internally?

终端是显示事物的设备。终端不替换,对它没有影响

很可能是您的系统设计者,但也可能是管理员或出版商或分销商或包装设计者(或链中的任何人)将您的系统配置为提供名为 c++ 的命令。通常,该命令是一个符号 link 到一个工作的 C++ 编译器,通常是 Linux 系统上的 g++。在我的系统上,/usr/bin/c++ 程序与 package named gcc, but some systems allow it to be configurable.

一起安装

It shouldn't do that right?

如上所述,终端不应该替换命令,它对它没有影响。

This is expected since

这是预期的,因为没有名为 c 的命令。还有无穷无尽的其他未知命令。

cc is the good old name for a C compiler. c99是C99兼容编译器的标准名称

Why am not getting a similar error for the c++ hello.cpp?

因为您的系统中存在名为 c++ 的命令。