Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
C(7)			Miscellaneous Information Manual		  C(7)

NAME
       c,  c78,	 c89,  c90,  c95, c99, c11, c17, c23, c2y -- The C programming
       language

DESCRIPTION
       C is a general purpose programming language, which has a	strong connec-
       tion with the UNIX operating system and its derivatives,	since the vast
       majority	of those systems were written in the C language.  The  C  lan-
       guage  contains	some  basic ideas from the BCPL	language through the B
       language	written	by Ken Thompson	in 1970	for the	 DEC  PDP-7  machines.
       The development of the UNIX operating system was	started	on a PDP-7 ma-
       chine  in assembly language, but	it made	very difficult to port the ex-
       isting code to other systems.

       In 1972 Dennis M. Ritchie worked	out the	 C  programming	 language  for
       further	development of the UNIX	operating system.  The idea was	to im-
       plement only the	C compiler for different platforms, and	implement most
       part of the operating system in the new programming  language  to  sim-
       plify the portability between different architectures.  It follows that
       C  is  very eligible for	(but not limited to) writing operating systems
       and low-level applications.

       The C language did not have a specification or standardized version for
       a long time.  It	went through a lot of  changes	and  improvements  for
       ages.   In 1978,	Brian W. Kernighan and Dennis M. Ritchie published the
       first book about	C under	the title "The C  Programming  Language".   We
       can  think  of  this  book  as the first	specification of the language.
       This version is often referred as K&R C after the names of the authors.
       Sometimes it is referred	as C78,	as well, after the publishing year  of
       the first edition of the	book.

       It  is important	to notice, that	the instruction	set of the language is
       limited to the most fundamental elements	for simplicity.	  Handling  of
       the  standard  I/O and such common functions are	implemented in the li-
       braries shipped with the	compiler.  As these functions are also	widely
       used,  it  was demanded to include into the description what requisites
       the library should conform to, not just strictly	the  language  itself.
       Accordingly,  the  aforementioned standards cover the library elements,
       as well.	 The elements of this standard library is still	not enough for
       more complicated	tasks.	In this	case the provided system calls of  the
       given operating system can be used.  To not lose	the portability	by us-
       ing these system	calls, the POSIX (Portable Operating System Interface)
       standard	 evolved.   It describes what functions	should be available to
       keep portability.  Note,	that POSIX is not a C standard,	but an operat-
       ing system standard and thus is beyond the scope	of this	 manual.   The
       standards discussed below are all C standards and only cover the	C pro-
       gramming	 language  and	the accompanying library.  All listed improve-
       ments for each standard edition are taken from  the  official  standard
       drafts.	 For  further  details,	check the publicly available drafts or
       purchase	the published standards	-- from	either ISO or IEC resources.

       After the publication of	the book mentioned before,  the	 American  Na-
       tional  Standards Institute (ANSI) started to work on standardizing the
       language, and they announced ANSI X3.159-1989 in	1989.  It  is  usually
       referred	 to  as	 ANSI  C or C89.  The main difference in this standard
       were the	function prototypes, which is a	new  way  of  declaring	 func-
       tions.	With the old-style function declarations, the compiler was un-
       able to check the sanity	of the actual parameters at a  function	 call.
       The  old	 syntax	was highly error-prone because incompatible parameters
       were hard to detect in the program code and the problem only showed  up
       at run-time.

       In  1990,  the  International  Organization  for	 Standardization (ISO)
       adopted the ANSI	standard as ISO/IEC 9899:1990 in 1990.	This  is  also
       referred	to as ISO C or C90.  It	only contains negligible minor modifi-
       cations	against	 ANSI  C,  so the two standards	often considered to be
       fully equivalent.  This was a very important milestone in  the  history
       of the C	language, but the development of the language did not stop.

       The  ISO	 C  standard  was  later extended with an amendment as ISO/IEC
       9899/AMD1 in 1995.  This	contained,  for	 example,  the	wide-character
       support	in <wchar.h> and <wctype.h>, and also restricted character set
       support via diagraphs and <iso646.h>.  This amendment  is  usually  re-
       ferred  to as C95.  Two technical corrigenda were also published: Tech-
       nical Corrigendum 1 as ISO/IEC 9899/COR1	in 1994	and  Technical	Corri-
       gendum  2 as ISO/IEC 9899/COR2 in 1996.	The continuous development and
       growth made it necessary	to work	out a new standard, which contains the
       new features and	fixes the known	defects	and deficiencies of  the  lan-
       guage.	As  a result, ISO/IEC 9899:1999	was born in 1999 as the	second
       edition of the standard.	 Similarly to the other	standards, this	is in-
       formally	named after the	publication year as C99.  The improvements in-
       clude (but are not limited to) the following:

	     	 digraphs, trigraphs, and alternative spellings	for the	opera-
		 tors that use non-ISO646 characters in	<iso646.h>

	     	 extended multibyte and	 wide  character  library  support  in
		 <wchar.h> and <wctype.h>

	     	 variable length arrays

	     	 flexible array	members

	     	 complex   (and	  imaginary)   number  arithmetic  support  in
		 <complex.h>

	     	 type-generic math macros in <tgmath.h>

	     	 the long long int type	and library functions

	     	 remove	implicit int type

	     	 universal character names (\u and \U)

	     	 compound literals

	     	 remove	implicit function declaration

	     	 BCPL style single-line	comments

	     	 allow mixed declarations and code

	     	 the vscanf() family of	functions in <stdio.h> and <wchar.h>

	     	 allow trailing	comma in enum declaration

	     	 inline	functions

	     	 the snprintf()	family of functions in <stdio.h>

	     	 boolean type and macros in <stdbool.h>

	     	 empty macro arguments

	     	 _Pragma preprocessing operator

	     	 __func__ predefined identifier

	     	 va_copy macro in <stdarg.h>

	     	 additional strftime conversion	specifiers

       Later in	2011, the third	edition	of the	standard,  ISO/IEC  1989:2011,
       commonly	 referred  to as C11 (formerly C1x), came out and replaced the
       second	 edition    by	  ISO/IEC     9899:1999/COR1:2001,     ISO/IEC
       9899:1999/COR2:2004, and	ISO/IEC	9899:1999/COR3:2007.  The improvements
       include (but are	not limited to)	the following:

	     	 support  for  multiple	threads	of execution and atomic	opera-
		 tions in <threads.h> and <stdatomic.h>

	     	 additional floating-point characteristic macros in <float.h>

	     	 querying and specifying alignment of objects in  <stdalign.h>
		 and <stdlib.h>

	     	 Unicode character types and functions in <uchar.h>

	     	 type-generic expressions

	     	 static	assertions in <assert.h>

	     	 anonymous structures and unions

	     	 remove	the gets function from <stdio.h>

	     	 add  the  aligned_alloc,  at_quick_exit, and quick_exit func-
		 tions in <stdlib.h>

       C11 was later superseded	by ISO/IEC 9899:2018, also known as C17	 which
       was  prepared in	2017 and published in June 2018	as the fourth edition.
       It    incorporates    the    Technical	 Corrigendum	1     (ISO/IEC
       9899:2011/COR1:2012) which was published	in 2012.  It addressed defects
       and  deficiencies in C11	without	introducing new	features, only correc-
       tions and clarifications.

       C23, formally ISO/IEC 9899:2024,	is the current standard	with  signifi-
       cant  updates that supersede C17	(ISO/IEC 9899:2018).  The standardiza-
       tion effort began in 2016, informally as	C2x, with the first WG14 meet-
       ing in 2019, and	was officially published on October 31,	2024.  C23 was
       originally anticipated for an earlier release, but the timeline was ex-
       tended due to COVID-19 pandemic.	 With C23, the	value  of  __STDC_VER-
       SION__  has  been updated from 201710L to 202311L.  Key changes include
       (but are	not limited to)	the following:

	     	 Add null pointer type nullptr_t and the nullptr keyword

	     	 Add constexpr keyword as a storage-class  specifier  for  ob-
		 jects

	     	 Redefine the usage of the auto	keyword	to support type	infer-
		 ence  while  also  retaining  its previous functionality as a
		 storage-class specifier when used with	a type

	     	 Add %b	 binary	 conversion  specifier	to  the	 printf()  and
		 scanf() function families

	     	 Add binary conversion support (0b and 0B) to the strtol() and
		 wcstol() function families

	     	 Add  the  #embed  directive for binary	resource inclusion and
		 __has_embed to	check resource availability with  preprocessor
		 directives

	     	 Add the #warning directive for	diagnostics

	     	 Add the #elifdef and #elifndef	directives

	     	 Add  the  u8 prefix for character literals to represent UTF-8
		 encoding, compatible with C++17

	     	 Add the char8_t type for UTF-8	encoded	data  and  update  the
		 types	of  u8	character  constants  and  string  literals to
		 char8_t

	     	 Add functions mbrtoc8() and c8rtomb() to convert between nar-
		 row multibyte characters and UTF-8 encoding

	     	 Define	all char16_t strings and literals  as  UTF-16  encoded
		 and  char32_t	strings	 and literals as UTF-32	encoded	unless
		 specified otherwise

	     	 Allow storage-class specifiers	within compound	literals

	     	 Support the latest IEEE  754  standard,  ISO/IEC  60559:2020,
		 with binary and (optional) decimal floating-point arithmetic

	     	 Add  single-argument  _Static_assert  for  compatibility with
		 C++17

	     	 Add _Decimal32, _Decimal64,  _Decimal128  keywords  for  (op-
		 tional) decimal floating-point	arithmetic

	     	 Add digit separator ' (the single quote character) for	liter-
		 als

	     	 Enable	specification of the underlying	type of	an enum

	     	 Standardize the typeof() operator

	     	 Add  memset_explicit()	in <string.h> to securely erase	sensi-
		 tive data regardless of optimizations

	     	 Add memccpy() in <string.h> for efficient  string  concatena-
		 tion

	     	 Add  memalignment() in	<stdlib.h> to determine	pointer	align-
		 ment

	     	 Add strdup() and strndup() in <string.h> to  allocate	string
		 copies

	     	 Introduce bit utility functions, macros, and types in the new
		 header	<stdbit.h>

	     	 Add  timegm()	in  <time.h> for converting time structures to
		 calendar time values

	     	 Add __has_include for header availability checking  via  pre-
		 processor directives

	     	 Add  __has_c_attribute	 to  check  attribute availability via
		 preprocessor directives

	     	 Add _BitInt(N)	and unsigned _BitInt(N)	for bit-precise	 inte-
		 gers, and BITINT_MAXWIDTH for maximum bit width

	     	 Elevate  true and false to proper keywords (previously	macros
		 from <stdbool.h>)

	     	 Add   keywords	  alignas,   alignof,	bool,	static_assert,
		 thread_local; previously defined keywords remain available as
		 alternative spellings

	     	 Enable	 zero initialization with {} (including	initialization
		 of VLAs)

	     	 Introduce C++11 style	attributes  using  [[]],  with	adding
		 [[deprecated]],  [[fallthrough]],  [[maybe_unused]], [[nodis-
		 card]], and [[noreturn]]

	     	 Deprecate _Noreturn, noreturn,	 header	 <stdnoreturn.h>  fea-
		 tures introduced in C11

	     	 Remove	trigraph support

	     	 Remove	K&R function definitions and declarations

	     	 Remove	 non-two's-complement representations for signed inte-
		 gers

       The next	version	of the C Standard, informally named  C2y,  is  antici-
       pated  to release within	the next six years, targeting 2030 at the lat-
       est.  A charter for C2y is still	being drafted and discussed, with sev-
       eral papers under debate	from the January 2024 meeting  in  Strasbourg,
       France  indicating  that	this new version may address long-standing re-
       quests and deficiencies noted by	the C community, while preserving  its
       core strengths.

       ISO/IEC JTC1/SC22/WG14 committee	is responsible for the ISO/IEC 9899, C
       Standard.

SEE ALSO
       c89(1), c99(1), cc(1)

STANDARDS
       ANSI, X3.159-1989 (aka C89 or ANSI C).

       ISO/IEC,	9899:1990 (aka C90).

       ISO/IEC,	9899:1990/AMD 1:1995, Amendment	1: C Integrity (aka C95).

       ISO/IEC,	9899:1990/COR 1:1994, Technical	Corrigendum 1.

       ISO/IEC,	9899:1990/COR 2:1996, Technical	Corrigendum 2.

       ISO/IEC,	9899:1999 (aka C99).

       ISO/IEC,	9899:1999/COR 1:2001, Technical	Corrigendum 1.

       ISO/IEC,	9899:1999/COR 2:2004, Technical	Corrigendum 2.

       ISO/IEC,	9899:1999/COR 3:2007, Technical	Corrigendum 3.

       ISO/IEC,	TR 24731-1:2007	(aka bounds-checking interfaces).

       ISO/IEC,	TS 18037:2008 (aka, embedded C).

       ISO/IEC,	TR 24747:2009 (aka mathematical	special	functions).

       ISO/IEC,	TR 24732:2009 (aka decimal floating-point).

       ISO/IEC,	TR 24731-2:2010	(aka dynamic allocation	functions).

       ISO/IEC,	9899:2011 (aka C11).

       ISO/IEC,	9899:2011/COR 1:2012, Technical	Corrigendum 1.

       ISO/IEC,	TS 17961:2013 (aka C secure coding rules).

       ISO/IEC,	TS 18861-1:2014	(aka binary floating-point).

       ISO/IEC,	TS 18861-2:2015	(aka decimal floating-point).

       ISO/IEC,	TS 18861-3:2015	(aka interchange and extended types).

       ISO/IEC,	TS 18861-4:2015	(aka supplementary functions).

       ISO/IEC,	TS 17961:2013/COR 1:2016 (aka C	secure coding rules TC1).

       ISO/IEC,	TS 18861-5:2016	(aka supplementary attributes).

       ISO/IEC,	9899:2018 (aka C17).

       ISO/IEC,	9899:2024 (aka C23).

HISTORY
       This manual page	first appeared in FreeBSD 9.0.

AUTHORS
       This   manual   page   was   originally	 written   by  Gabor  Kovesdan
       <gabor@FreeBSD.org>.  It	was updated by Faraz Vahedi <kfv@kfv.io>  with
       information about more recent C standards.

FreeBSD	15.0		       November	4, 2024				  C(7)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=c&sektion=7&manpath=FreeBSD+15.0-RELEASE+and+Ports>

home | help