“文件”命令混淆 C & C++

Sea*_*mus 3 mime-types files

file用于检查某些文件类型时,我注意到它似乎错误地将 C++ 文件标记为 C 文件:

$ file User.*
User.cpp: C source, ASCII text
User.h:   C++ source, ASCII text
User.o:   ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
Run Code Online (Sandbox Code Playgroud)

为什么它可以正确识别头文件,但不能正确识别 cpp 文件?

Ram*_*esh 9

从手册页 file命令的,

file 命令实际上执行了 3 次确定文件类型的测试。

第一次测试

文件系统测试基于检查 stat(2) 系统调用的返回。

第二次测试

幻数测试用于检查具有特定固定格式数据的文件。

第三次测试

语言测试查找可以出现在文件前几个块中的任何位置的特定字符串 (cf names.h)。例如,关键字 .br 表示该文件很可能是 troff(1) 输入文件,就像关键字 struct 表示 C 程序一样。

file命令的输出通常基于任何成功的测试的结果。

现在,假设C++程序是这样启动的,第三次测试成功,

#include <iostream.h>
bla
bla
Run Code Online (Sandbox Code Playgroud)

根据第三个测试,尽管我们手头有一个CPP程序,但关键字#include特别指定它是C 类程序。现在,当我检查时,

$ file example.cpp

example.cpp: ASCII C program text
Run Code Online (Sandbox Code Playgroud)

现在,面向对象的概念是特定于 C++ 的。让我们创建一个特定于C++的文件。

我开始我的 C++ 程序,

Class something
{
}
bla
bla
Run Code Online (Sandbox Code Playgroud)

现在,当我发出

$ file example.cpp
Run Code Online (Sandbox Code Playgroud)

输出是,

example.cpp: ASCII C++ program text
Run Code Online (Sandbox Code Playgroud)