, "C11" is the previous standard for the C programming language. Notable features introduced over the previous revision include improved Unicode support, type-generic expressions using the new codice_17 keyword, a cross-platform multi-threading API (codice_18) and atomic types support in both core language and the library (codice_19). One technical corrigendum has been published by ISO for C11:   , "C18" is the current standard for the C programming language. As part of the standardization process, ISO also publishes technical reports and specifications related to the C language:  More technical specifications are in development and pending approval, including the fifth and final part of TS 18661, a software transactional memory specification, and parallel library extensions. ANSI C is now supported by almost all the widely used compilers. GCC and Clang are two major C compilers popular today, both are based on the C11 with updates including changes from later specifications such as C17 and C18. Any program written "only" in standard C and without any hardware dependent assumptions is virtually guaranteed to compile correctly on any platform with a conforming C implementation. Without such precautions, most programs may compile only on a certain platform or with a particular compiler, due, for example, to the use of non-standard libraries, such as GUI libraries, or to the reliance on compiler- or platform-specific attributes such as the exact size of certain data types and byte endianness. To mitigate the differences between K&R C and the ANSI C standard, the codice_20 ("standard c") macro can be used to split code into ANSI and K&R sections. In the above example, a prototype is used in a function declaration for ANSI compliant implementations, while an obsolescent non-prototype declaration is used otherwise. Those are still ANSI-compliant as of C99. Note how this code checks both definition and evaluation: this is because some implementations may set codice_20 to zero to indicate non-ANSI compliance.