COHERENT manpages
This page displays the COHERENT manpage for C language [Overview].
List of available manpages
Index
C language -- Overview COHERENT includes a C compiler that fully implements the Kernighan and Ritchie standard of C, with extensions taken from the ANSI standard. Please note that in the following discussion, word indicates an object 16 bits long; dword, an object 32 bits long; and qword, an object 64 bits long: Identifiers Characters allowed: A-Z, a-z, _, 0-9 Case sensitive Number of significant characters in a variable name: 255 Escape Sequences The COHERENT C compiler recognizes the following escape sequences: ASCII Ctrl Hex Description \a BEL <ctrl-G> 0x07audible tone (bell) \b BS <ctrl-H> 0x08backspace \f FF <ctrl-L> 0x12formfeed \n LF <ctrl-J> 0x0Alinefeed (newline) \r CR <ctrl-M> 0x0Dcarriage return \t HT <ctrl-I> 0x09horizontal tab \v VT <ctrl-K> 0x0Bvertical tab \xhh 0xhh hex (one to four hex digits [0-9a-fA-F]) \ooo octal (one to four octal digits [0-7]) Trigraphs The COHERENT C compiler recognizes the following trigraphs: Trigraph Character Sequence Represented ??= # ??( [ ??/ \ ??) ] ??' ^ ??< { ??! | ??> } ??- ~ For details, see the Lexicon entry trigraph. Reserved Identifiers (Keywords) See the Lexicon entry for C keywords. Data Formats (in bits) char 8 unsigned char 8 double 64 enum 8|32 float 32 int 32 unsigned int 32 long 32 unsigned long 32 pointer 32 short 16 unsigned short 16 Floating-Point Formats IEEE floating-point float: 1 sign bit 8-bit exponent 24-bit normalized fraction with hidden bit Bias of 127 IEEE floating-point double: 1 sign bit 11-bit exponent 53-bit fraction Bias of 1,023 Reserved values: +- infinity, -0 All floating-point operations are done as doubles. Limits Maximum bitfield size: 32 bits Maximum number of cases in a switch: no formal limit Maximum number of arguments in function declaration: 32 Maximum number of arguments in function call: no formal limit Maximum block nesting depth: no formal limit Maximum parentheses nesting depth: no formal limit Maximum structure size: no formal limit Maximum array size: no formal limit Preprocessor Instructions #define #ifdef #else #ifndef #elif #include #endif #line #if #undef #pragma Structure Name-Spaces Supports both Berkeley and Kernighan-Ritchie conventions for structure in union. Function Linkage Return values in EAX Return values for doubles: With software floating-point emulation returns in EDX:EAX Hardware floating-point (-VNDP) returns in the NDP stacktop %st0 Parameters pushed on stack in reverse order: chars, shorts, and pointers pushed as dwords Structures copied onto the stack Caller must clear parameters off stack Stack frame linkage is done through ESP register Structures and Alignment Structure members are aligned according to the most strictly aligned type within the structure. For example, a structure is word-aligned if it contains only shorts, but on dword if it contains an int or long. #pragma align n can override this feature. Registers Registers EBX, EDI, and ESI are available for register variables. Only 32-bit objects go into registers. Special Features and Optimizations Both implementations of C perform the following optimizations: -> Branch optimization is performed: this uses the smallest branch instruction for the required range. -> Unreached code is eliminated. -> Duplicate instruction sequences are removed. -> Jumps to jumps are eliminated. -> Multiplication and division by constant powers of two are changed to shifts when the results are the same. -> Sequences that can be resolved at compile time are identified and resolved. Compilation Environments COHERENT supports a number of different compilation environments. For example, you can compile a program to use the environment for UNIX System V release 4 or release 3, or the Berkeley environment. This is done by setting manifest constants on your C compiler's command line, which, in turn, invokes various settings within the header files. For details, see the Lexicon entry for header files. Example The following gives an example C program, which does something interesting. It was writen by Charles Fiterman: char *x="char *x=%c%s%c;%cmain(){printf(x,34,x,34,10,10);}%c"; main(){printf(x,34,x,34,10,10);} See Also argc, argv, C keywords, C preprocessor, environ, envp, header files, initialization, libraries, main(), name space, offsetof(), Programming COHERENT, trigraph