Команда «file» запутывает C & C ++

При использовании 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 

Почему он правильно идентифицирует заголовочный файл, но не файл cpp?

Из man-страницы команды file ,

file фактически выполняет 3 теста на определение типа файла.

Первый тест

Тесты файловой системы основаны на проверке возврата из системного вызова stat (2).

Второй тест

Тесты магического числа используются для проверки файлов с данными в определенных фиксированных форматах.

Третий тест

Языковые тесты ищут определенные строки (cf names.h), которые могут появляться в любом месте в первых нескольких блоках файла. Например, ключевое слово .br указывает, что файл, скорее всего, является входным файлом troff (1), так же, как ключевое слово struct указывает программу на C.

Вывод команды file обычно основан на результате любого из тестов, которые преуспевают.

Теперь, предполагая, что программа на C ++ начинается так, и третий тест преуспевает,

 #include <iostream.h> bla bla 

Согласно третьему тесту ключевое слово #include частности, указывает, что это программа типа C, хотя у нас есть программа CPP в руке. Теперь, когда я проверяю,

 $ file example.cpp example.cpp: ASCII C program text 

Теперь понятия объектно-ориентированного являются специфическими для C ++. Создадим файл, специфичный для C ++ .

Я запускаю свою программу на C ++,

 Class something { } bla bla 

Теперь, когда я выпускаю

 $ file example.cpp 

Выходной сигнал,

 example.cpp: ASCII C++ program text