Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is a compiler allowed to add functions to standard headers?

Is a C compiler allowed to add functions to standard headers and still conform to the C standard?

I read this somewhere, but I can't find any reference in the standard, except in annex J.5:

The inclusion of any extension that may cause a strictly conforming program to become invalid renders an implementation nonconforming. Examples of such extensions are new keywords, extra library functions declared in standard headers, or predefined macros with names that do not begin with an underscore.

However, Annex J is informative and not normative... so it isn't helping.

So I wonder if it is okay or not for a conforming compiler to add additional functions in standard headers?

For example, lets say it adds non-standard itoa to stdlib.h.

like image 500
Lundin Avatar asked Nov 25 '11 14:11

Lundin


2 Answers

In 4. "Conformance" §6, there is:

A conforming implementation may have extensions (including additional library functions), provided they do not alter the behavior of any strictly conforming program.

with the immediate conclusion in a footnote:

This implies that a conforming implementation reserves no identifiers other than those explicitly reserved in this International Standard.

The reserved identifiers are described in 7.1.3. Basically, it is everything starting with an underscore and everything explicitly listed as used for the standard libraries.

So, yes the compiler is allowed to add extensions. But they have to have a name starting with an underscore or one of the prefixes reserved for libraries.

itoa is not a reserved identifier and a compiler defining it in a standard header is not conforming.

like image 71
undur_gongor Avatar answered Sep 20 '22 10:09

undur_gongor


In "7.26 Future library directions" you have a list of the identifiers that may be added to the standard headers, this includes identifiers starting with str or mem, macros starting with E and stuff like that.

Other than that, implementations are restricted to the generic names as reserved in "7.1.3 Reserved identifiers".

like image 27
Jens Gustedt Avatar answered Sep 21 '22 10:09

Jens Gustedt