Because some archaic systems couldn't deal with the pluses in .c++, many substitutes have been made up. These however complicate searching for C++ files. However, it's a widely known fact that C++ is so complex no 2 programmers write it the same, thus don't feel comfortable reading each other's code. Therefore naturally, different extensions should be assigned to different styles of C++.
Assuming infinite memory, there are 6 turing-complete sublanguages in C++:
* ANSI C90 -> .C
* "Classic" C++ -> .cpp
* Metatemplate metaprogramming -> .hxx
* "Modern" "idiomatic" C++ -> .cxx
* C Preprocessor -> .h
* Embedded Assembler -> .ccs, .cps, .cxs
Impl Head Contents Explanation
.b N/A B For machines with no types
.c .h C K&R C, Turbo C, ANSI C, C90, C99, C11/C18, C23
.m .h Objective-C Apple's C++, AT&T was probably too secretive
.C .H "C/C++" C to be compiled with C++ compiler
.cc .hh C-style C++ C with Classes (smart structs), a bit Java-style
.cpp .hpp Early/Classic C++ Borland Turbo C++, MSVC++, C++/CLI, C++98, C++03
.mpp .hpp Objective-C++ (... and this is Jackass)
.cxx .hxx Middle/Modern C++ Heavy use of C++11 λs, threads & smart pointers
.mxx .hxx Objective-C++11
.c++ .h++ Postmodern C++ Heavy use of C++20 concepts and modules
.m++ .h++ Objective-C++20
.cs N/A C# (formerly C*) C#: M$ Java; C*: C dialect for parallelization
.cas .h C with much ASM Used when not using standard library
.ccs .hh CwC with ASM Using C++ without STL is way harder
.cps .hpp C++98+ with ASM
.cxs .hxx C++11+ with ASM
.c+s .hpp C++20+ with ASM
.s N/A AT&T/GNU ASM When linking to .c or .cpp files
.asm N/A PC Assemblers Independent
It's common to use .h regardless of C++ type, because usually they are made to work in both C and C++. There's probably no need for Objective-C++20 or later as the iSheep are told to use Swift. The line between .cxx and .c++ may be some later revision which turns out to be a greater milestone, but replacing #include with modules seems to be the one.
Coincidentally, Turbo Pascal and Turbo C sound too close to turpa paska (shut shit) and turpa kii (shut up), which is what a Finn may yell in frustration at the error messages. Also, (Objective-)C++ has become so complex and bloated, in their pursuit of OOP ideology, that the much criticized ALGOL 68 seems like a nice and clean language compared to it, even if the syntax may feel obtuse. After 43 years, Algol 68 Genie is finally a free implementation.
Fortran -> Algol 58 -> Algol 60 -> Algol 68 ,-> Objective-C
|-> CPL -> BCPL -> B -> C -> C++ -> Java -> C#
|-> Pascal -> Modula -> Oberon '-> D '-> Groovy
'-> Green -> Ada
I eagerly await the implementation of the short float proposal, because floating point errors are easier to replicate with shorter types. There's already __fp16 for ARM in GCC, _Float16 in C, and Half in .NET. IEEE decimal floats are useless because most financial software uses fixed point, BCD, or just stores the value in cents. Templates are fine for software arbitrary precision, but I mean hardware. Also I would like a long long double to have actual 128-bit floats on x86 machines (some AVX-512 extension maybe) instead of this SIMD-incompatible 80-bit 8087 thing. I'll have to go for RV128GQVZfh probably.