4.1.1 Implementation-defined behavior of C90

This section covers the implementation-defined behavior given by the C90 standard.

(1)

Data types and sizes

See "4.1.3 Internal representation and value area of data".

(2)

Translation stages

The ANSI standards specify eight translation stages (known as "phases") of priorities among syntax rules for translation. The arrangement of "non-empty white space characters excluding line feed characters" which is defined as implementation dependent in phase 3 "Decomposition of source file into preprocessing tokens and white space characters" is maintained as it is without being replaced by single white space character.

(3)

Diagnostic messages

When syntax rule violation or restriction violation occurs on a translation unit, the compiler outputs as error message containing source file name and (when it can be determined) the number of line containing the error. These error messages are classified: "Warning", "Fatal error", "Error" and "other" messages. For output formats of messages, see the "10.2 Message Formats".

(4)

Program startup processing

The name, type, and arguments of a function that is called on starting program processing are not stipulted.

Therefore, it is dependent on the user-own coding and target system.

(5)

Program execution

The configuration of the interactive unit is not stipulated.

Therefore, it is dependent on the user-own coding and target system.

(6)

Character set

The values of elements of the source code character set and execution character set are ASCII codes, EUC, SJIS, UTF-8, big5, and gb2312.

Japanese and Chinese characters are supported in comments and character strings.

(7)

Shift states used in encoding of multi-byte characters

No shift state is supported.

(8)

Significance of character display

The values of expanded notation are stipulated as follows.

Table 4.1

Expanded Notation and Meaning

Expanded Notation

Value (ASCII)

Meaning

\a

07

Alert (Warning tone)

\b

08

Backspace

\f

0C

Form feed (New Page)

\n

0A

New line (Line feed)

\r

0D

Carriage return (Restore)

\t

09

Horizontal tab

\v

0B

Vertical tab

(9)

Translation limit

There are limits on translation as shown below. In addition to the absolute quantitative limits of the compiler, there are limits depending on the memory of the host machine on which the compiler is running.

-

In a single declaration, the maximum number of pointer, array, and function declarators (and their combinations) that qualify a single arithmetic type, structure type, union type, or incomplete type is 128.

-

The maximum number of bytes for one object is 32767 (in the host environment). However, when the -large_variable option is specified, the maximum number is 65,535.

-

The maximum number of case values in a switch statement is 65535.

(10)

Quantitative limit

See "(10) Standard header" in "4.2.3 C99 language specifications supported in conjunction with C90".

(11)

Identifier

All identifiers are considered to have meaning.

Uppercase and lowercase characters are distinguished.

(12)

char type

If a quantity that is not a member of the source character set is stored in the char type, it is handled as the value converted to the char type.

When the -signed_char option is not used, the plain char type has the same range of values as that of the unsigned char type. When the -signed_char option is used, the plain char type has the same range of values as that of the signed char type.

char    ch = '\777';     /*Value of ch is +255.*/

(13)

Floating-point constants

A value is rounded toward the result obtained by assuming an infinite number of significant digits. The center value between a multiplication result and the result obtained by assuming an infinite number of significant digits is rounded so that the result becomes an even value.

(14)

Character constants

(a)

Both the character set of the source program and the character set in the execution environment are basically ASCII codes, and correspond to members having the same value.
However, for the character set of the source program, character codes in Japanese can be used (see "(8) Significance of character display").

(b)

An integer character constant containing two or less characters has the value of the int type in which the lower byte holds the last character and the upper byte holds the first character. A character constant containing three or more characters will lead to an error.

int a1 = 'a';       /* 0x61 */
int a2 = 'ab';      /* 0x6162 */
int a3 = 'abc';     /* Error */

(c)

A character that cannot be expressed by the basic execution environment character set or escape sequence is expressed as follows.

<1>

An octal or hexadecimal escape sequence takes the value indicated by the octal or hexadecimal notation

\777

511

<2>

The simple escape sequence is expressed as follows.

\'

'

\"

"

\?

?

\\

\

<3>

Values of \a, \b, \f, \n, \r, \t, \v are same as the values explained in "(8) Significance of character display".

(d)

Character constants of multi byte characters are not supported.

(15)

Character string

A character string can be described in Japanese and Chinese.

The default character code is Shift JIS.

A character code in input source file can be selected by using the -character_set option of the CC-RL.

-character_set=[none | euc_jp | sjis | utf8 | big5 | gbk]

(16)

Locale

No locale is supported.

(17)

Header file name

The method to reflect the string in the two formats (< > and " ") of a header file name on the header file or an external source file name is stipulated in "(35) Loading header file".

(18)

Comment

A comment can be described in Japanese and Chinese. The character code is the same as the character string in "(15) Character string".

(19)

Character and integer types

A plain char type not specified as signed or unsigned is handled as unsigned. When the -signed_char option is specified, it is handled as signed.

(20)

Signed constants and unsigned constants

If the value of a general integer type is converted into a signed integer of a smaller size, the higher bits are truncated and a bit string image is copied.

If an unsigned integer is converted into the corresponding signed integer, the internal representation is not changed.

(21)

Floating-points and general integers

If the value of a general integer type is converted into the value of a floating-point type, and if the value to be converted is within a range that can be expressed but not accurately, the result is rounded toward the result obtained by assuming an infinite number of significant digits. An intermediate value is rounded so that the result becomes an even value.

(22)

double type and float type

When casting a double to a float, or a long double to a double or a float, if the typecast value cannot be represented accurately in the available value range, the result is rounded toward the result obtained by assuming an infinite number of significant digits. An intermediate value is rounded so that the result becomes an even value.

(23)

Signed type in operator in bit units

The characteristics of the shift operator conform to the stipulation in "(29) Shift operator in bit units".

The other operators in bit units for signed type are calculated as unsigned values (as in the bit image).

(24)

Members of structures and unions

If the value of a union member is stored in a different member, the value will be stored in accordance with the alignment condition. As a result, access to members of the union will be of the subsequently accessed type.

(25)

sizeof operator

The result of the "sizeof" operator is handled as the unsigned int type.

(26)

Cast operator

When a pointer is converted to a general integer type, the required variable size is as follows.

-

near : 2 -byte

-

far : 4-byte

 

The bit string is saved as is as the conversion result. Note that the most significant byte (undefined value) of a far pointer is converted to 0.

Any integer can be converted to a pointer type but if the size of the pointer type is smaller than that of the integer type, the value is truncated to the pointer size. If the size of the pointer type is larger than that of the integer type, the integer type is normally converted up to the pointer size and then converted to the pointer type.

As the near and far pointers affect conversion, see the "Cast" description in "Specifying memory allocation area (__near /__far)".

(27)

Division/remainder operator

The result of the division operator ("/") when the operands are negative and do not divide perfectly with integer division, is as follows: If either the divisor or the dividend is negative, the result is the smallest integer greater than the algebraic quotient.

If both the divisor and the dividend are negative, the result is the largest integer less than the algebraic quotient.

If the operand is negative, the result of the "%" operator takes the sign of the first operand in the expression.

(28)

Addition and subtraction operators

If two pointers indicating the elements of the same array are subtracted, the type of the result is signed int type.

(29)

Shift operator in bit units

If E1 of "E1 >> E2" is of signed type and takes a negative value, an arithmetic shift is executed.

(30)

Storage area class specifier

Optimize for the fastest possible access, regardless of whether there is a storage-class area specifier "register" declaration.

(31)

Structure and union specifier

(a)

A simple int type bit field not specified as signed or unsigned is handled as an unsigned int type. However, when the -signed_bitfield option is specified, it becomes the value of signed int.

(b)

To retain a bit field, a storage area unit to which any address with sufficient size can be assigned can be allocated. If there is insufficient area, however, the bit field that does not match is packed into to the next unit according to the alignment condition of the type of the field.
The allocation sequence of the bit field in unit is from lower to higher.

(c)

Each member of the non-bit field of one structure or union is aligned at a boundary as follows:

_Bool, char, signed char, unsigned char type

1-byte enumerated type and its array

1-byte boundary

Types other than the above except for structure type and union type, and 2-byte enumerated type

2-byte boundary

 

When a member is a structure or union object, it is aligned to the boundary specified in the structure or union definition of the member.

(32)

Enumerated type specifier

The type of an enumerator is char, signed char, unsigned char, or signed short depending on the range of the enumeration constants to be defined. For the details of description, see "(4) Enumerated type".

(33)

Type qualifier

The configuration of access to data having a type qualified to be "volatile" is dependent upon the address (I/O port, etc.) to which the data is mapped. However, optimization is not applied to the locations where such a variable is accessed.

The size of access to such a variable is guaranteed when the following conditions are satisfied.

-

When a variable is not a bit field and is declared in any of the following types, the variable is accessed in the same size as the declared type.

-

(signed/unsigned)int

-

(signed/unsigned)short

-

near variable pointer

-

near function pointer

-

(signed/unsigned)char

-

_Bool

-

Enumerated type

(34)

Condition embedding

(a)

The value for the constant specified for condition embedding and the value of the character constant appearing in the other expressions are equal.

(b)

A single-character character constant cannot have a negative value.

(35)

Loading header file

(a)

A preprocessing directive in the form of "#include <character string>"

A preprocessing directive in the form of "#include <character string>" searches for a header file from the folder specified by the -I option if "character string" does not begin with "\"Note, and then searches standard include file folder (..\inc folder with a relative path from the bin folder where the ccrl is placed).

If a header file uniformly identified is searched with a character string specified between delimiters "<" and ">", the whole contents of the header file are replaced.

Note

"/" are regarded as the delimiters of a folder.

Example

#include    <header.h>

 

The search order is as follows.

-

Folder specified by -I

-

Standard include file folder

(b)

A preprocessing directive in the form of "#include "character string""

A preprocessing directive in the form of "#include "character string"" searches for a header file from the folder where the source file exists if "character string" does not begin with "\"Note, and then searches specified folder (-I option), and then searches standard include file folder (..\inc folder with a relative path from the bin folder where the ccrl is placed).

If a header file uniformly identified is searched with a character string specified between delimiters " " " and " " ", the whole contents of the header file are replaced.

Note

"/" are regarded as the delimiters of a folder.

Example

#include    "header.h"

 

The search order is as follows.

-

Folder including the current file to be translated (file containing #include "character string")

-

Folder specified by -I

-

Standard include file folder

(c)

The format of "#include preprocessing character phrase string"

The format of "#include preprocessing character phrase string" is treated as the preprocessing character phrase of single header file only if the preprocessing character phrase string is a macro that is replaced to the form of <character string> or "character string".

(d)

A preprocessing directive in the form of "#include <character string>"

Between a string delimited (finally) and a header file name, the length of the alphabetic characters in the strings is identified,

"And the file name length valid in the compiler operating environment is valid."

The folder where the file is searched for conforms to the above stipulation.

(36)

#pragma directive

See "4.2.4 #pragma directive".

(37)

Predefined macro names

See "4.2.2 Macro".

(38)

NULL macro

The NULL macro is defined as follows.

#define NULL    ((void )0)

(39)

Standard library functions

The following shows the implementation-defined items regarding standard library functions.

The sets of characters tested for by the isalnum, isalpha, iscntrl, islower, isprint, and isupper functions

unsigned char type (0 to 255) and EOF (-1).

The values returned by the mathematics functions on domain errors

Refer to "7.5 Library Function".

Whether the mathematics functions set the integer expression errno to the value of the macro ERANGE on underflow range errors

Refer to "7.5 Library Function".

Whether a domain error occurs or zero is returned when the fmod function has a second argument of zero

Refer to "7.5 Library Function".

The set of signals for the signal function

CC-RL does not support the signal function.

The semantics for each signal recognized by the signal function

The default handling and the handling at program startup for each signal recognized by the signal function

If the equivalent of signal (sig, SIG_DFL); is not executed prior to the call of a signal handler, the blocking of the signal that is performed

Whether the default handling is reset if the SIGILL signal is received by a handler specified to the signal function

Whether the last line of a text stream requires a terminating new-line character

A new-line character is not required.

Whether space characters that are written out to a text stream immediately before a new-line character appear when read in

Space characters appear.

The number of null characters that may be appended to data written to a binary stream

No null characters may be appended.

Whether the file position indicator of an append mode stream is initially positioned at the beginning or end of the file

CC-RL does not support the file manipulation functions.

Whether a write on a text stream causes the associated file to be truncated beyond that point

The characteristics of file buffering

Whether a zero-length file actually exists

The rules for composing valid file names

Whether the same file can be open multiple times

The effect of the remove function on an open file

CC-RL does not support the remove function.

The effect if a file with the new name exists prior to a call to the rename function

CC-RL does not support the rename function.

The output for %p conversion in the fprintf function

Refer to "7.5 Library Function".

The input for %p conversion in the fscanf function

Refer to "7.5 Library Function".

The interpretation of a - character that is neither the first nor the last character in the scanlist for %[ conversion in the fscanf function

The value to which the macro errno is set by the fgetpos or ftell function on failure

CC-RL supports neither the fgetpos nor the ftell function.

The messages generated by the perror function

Refer to "7.5 Library Function".

The behavior of the calloc, malloc, or realloc function if the size requested is zero

Refer to "7.5 Library Function".

The behavior of the abort function with regard to open and temporary files

CC-RL does not support the file manipulation functions.

The status returned by the exit function if the value of the argument is other than zero, EXIT_SUCCESS, or EXIT_FAILURE

CC-RL does not support the exit function.

The set of environment names and the method for altering the environment list used by the getenv function

CC-RL does not support the getenv function.

The contents and mode of execution of the string by the system function

CC-RL does not support the system function.

The contents of the error message strings returned by the strerror function

Refer to "7.5 Library Function".

The local time zone and Daylight Saving Time

CC-RL does not support time.h.

The era for the clock function

CC-RL does not support the functions that handle time.