Changeset 7527e63 for doc/user/user.tex
- Timestamp:
- Aug 16, 2016, 3:20:06 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 1f6d4624
- Parents:
- 950f7a7 (diff), 7880579 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/user/user.tex
r950f7a7 r7527e63 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Wed Jul 13 08:14:39201614 %% Update Count : 1 24713 %% Last Modified On : Sun Aug 14 08:23:06 2016 14 %% Update Count : 1323 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 211 211 however, it largely extended the language, and did not address many existing problems.\footnote{% 212 212 Two important existing problems addressed were changing the type of character literals from ©int© to ©char© and enumerator from ©int© to the type of its enumerators.} 213 \Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features ( e.g.,objects, concurrency) are added and problems fixed within the framework of the existing language.213 \Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features (\eg objects, concurrency) are added and problems fixed within the framework of the existing language. 214 214 \Index*{Java}~\cite{Java8}, \Index*{Go}~\cite{Go}, \Index*{Rust}~\cite{Rust} and \Index*{D}~\cite{D} are examples of the revolutionary approach for modernizing C/\CC, resulting in a new language rather than an extension of the descendent. 215 215 These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection. … … 226 226 227 227 \section{Interoperability} 228 \label{s:Interoperability} 228 229 229 230 \CFA is designed to integrate well with existing C programs and libraries. … … 265 266 \section[Compiling CFA Program]{Compiling \CFA Program} 266 267 267 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, e.g.:268 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, \eg: 268 269 \begin{lstlisting} 269 270 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ] … … 314 315 The \CFA compilation message is printed at the beginning of a compilation. 315 316 \textbf{This option is the default.} 317 318 \item 319 \Indexc{-no-include-stdhdr}\index{compilation option!-no-include-stdhdr@©-no-include-stdhdr©} 320 Do not supply ©extern "C"© wrappers for \Celeven standard include files (see~\VRef{s:StandardHeaders}). 321 \textbf{This option is \emph{not} the default.} 316 322 \end{description} 317 323 … … 350 356 \section{Underscores in Constants} 351 357 352 Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, e.g.:358 Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, \eg: 353 359 \begin{lstlisting} 354 360 2®_®147®_®483®_®648; §\C{// decimal constant}§ … … 366 372 \begin{enumerate} 367 373 \item 368 A sequence of underscores is disallowed, e.g.,©12__34© is invalid.374 A sequence of underscores is disallowed, \eg ©12__34© is invalid. 369 375 \item 370 376 Underscores may only appear within a sequence of digits (regardless of the digit radix). 371 In other words, an underscore cannot start or end a sequence of digits, e.g.,©_1©, ©1_© and ©_1_© are invalid (actually, the 1st and 3rd examples are identifier names).377 In other words, an underscore cannot start or end a sequence of digits, \eg ©_1©, ©1_© and ©_1_© are invalid (actually, the 1st and 3rd examples are identifier names). 372 378 \item 373 379 A numeric prefix may end with an underscore; … … 498 504 \end{quote2} 499 505 500 All type qualifiers, e.g., ©const©, ©volatile©, etc., are used in the normal way with the new declarations and also appear left to right, e.g.:506 All type qualifiers, \eg ©const©, ©volatile©, etc., are used in the normal way with the new declarations and also appear left to right, \eg: 501 507 \begin{quote2} 502 508 \begin{tabular}{@{}l@{\hspace{1em}}l@{\hspace{1em}}l@{}} … … 518 524 \end{tabular} 519 525 \end{quote2} 520 All declaration qualifiers, e.g.,©extern©, ©static©, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier}521 The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}} e.g.:526 All declaration qualifiers, \eg ©extern©, ©static©, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier} 527 The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}} \eg: 522 528 \begin{quote2} 523 529 \begin{tabular}{@{}l@{\hspace{3em}}l@{\hspace{2em}}l@{}} … … 542 548 Unsupported are K\&R C declarations where the base type defaults to ©int©, if no type is specified,\footnote{ 543 549 At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each structure declaration and type name~\cite[\S~6.7.2(2)]{C11}} 544 e.g.:550 \eg: 545 551 \begin{lstlisting} 546 552 x; §\C{// int x}§ … … 612 618 A \Index{pointer}/\Index{reference} is a generalization of a variable name, i.e., a mutable address that can point to more than one memory location during its lifetime. 613 619 (Similarly, an integer variable can contain multiple integer literals during its lifetime versus an integer constant representing a single literal during its lifetime and may not occupy storage as the literal is embedded directly into instructions.) 614 Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, e.g.:620 Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, \eg: 615 621 \begin{quote2} 616 622 \begin{tabular}{@{}ll@{}} … … 669 675 Except for auto-dereferencing by the compiler, this reference example is the same as the previous pointer example. 670 676 Hence, a reference behaves like the variable name for the current variable it is pointing-to. 671 The simplest way to understand a reference is to imagine the compiler inserting a dereference operator before the reference variable for each reference qualifier in a declaration, e.g.:677 The simplest way to understand a reference is to imagine the compiler inserting a dereference operator before the reference variable for each reference qualifier in a declaration, \eg: 672 678 \begin{lstlisting} 673 679 r2 = ((r1 + r2) * (r3 - r1)) / (r3 - 15); … … 677 683 ®*®r2 = ((®*®r1 + ®*®r2) ®*® (®**®r3 - ®*®r1)) / (®**®r3 - 15); 678 684 \end{lstlisting} 679 When a reference operation appears beside a dereference operation, e.g.,©&*©, they cancel out.\footnote{685 When a reference operation appears beside a dereference operation, \eg ©&*©, they cancel out.\footnote{ 680 686 The unary ©&© operator yields the address of its operand. 681 687 If the operand has type ``type'', the result has type ``pointer to type''. … … 721 727 ®&®crc = &cx; §\C{// error, cannot change crc}§ 722 728 \end{lstlisting} 723 Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be ©0© unless an arbitrary pointer is assigned to the reference}, e.g.:729 Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be ©0© unless an arbitrary pointer is assigned to the reference}, \eg: 724 730 \begin{lstlisting} 725 731 int & const r = *0; §\C{// where 0 is the int * zero}§ 726 732 \end{lstlisting} 727 733 Otherwise, the compiler is managing the addresses for type ©& const© not the programmer, and by a programming discipline of only using references with references, address errors can be prevented. 734 Finally, the position of the ©const© qualifier \emph{after} the pointer/reference qualifier causes confuse for C programmers. 735 The ©const© qualifier cannot be moved before the pointer/reference qualifier for C style-declarations; 736 \CFA-style declarations attempt to address this issue: 737 \begin{quote2} 738 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} 739 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 740 \begin{lstlisting} 741 ®const® * ®const® * const int ccp; 742 ®const® & ®const® & const int ccr; 743 \end{lstlisting} 744 & 745 \begin{lstlisting} 746 const int * ®const® * ®const® ccp; 747 748 \end{lstlisting} 749 \end{tabular} 750 \end{quote2} 751 where the \CFA declaration is read left-to-right (see \VRef{s:Declarations}). 728 752 729 753 \Index{Initialization} is different than \Index{assignment} because initialization occurs on the empty (uninitialized) storage on an object, while assignment occurs on possibly initialized storage of an object. … … 783 807 784 808 809 \section{Backquote Identifiers} 810 \label{s:BackquoteIdentifiers} 811 812 \CFA accommodates keyword clashes by syntactic transformations using the \CFA backquote escape-mechanism: 813 \begin{lstlisting} 814 int `otype` = 3; // make keyword an identifier 815 double `choose` = 3.5; 816 \end{lstlisting} 817 Programs can be converted easily by enclosing keyword identifiers in backquotes, and the backquotes can be removed later when the identifier name is changed to an non-keyword name. 818 Clashes in C header files (see~\VRef{s:StandardHeaders}) can be handled automatically using the preprocessor, ©#include_next© and ©-I filename©: 819 \begin{lstlisting} 820 // include file uses the CFA keyword "otype". 821 #if ! defined( otype ) // nesting ? 822 #define otype `otype` 823 #define __CFA_BFD_H__ 824 #endif // ! otype 825 826 #include_next <bfd.h> // must have internal check for multiple expansion 827 828 #if defined( otype ) && defined( __CFA_BFD_H__ ) // reset only if set 829 #undef otype 830 #undef __CFA_BFD_H__ 831 #endif // otype && __CFA_BFD_H__ 832 \end{lstlisting} 833 834 785 835 \section{Type Operators} 786 836 787 The new declaration syntax can be used in other contexts where types are required, e.g.,casts and the pseudo-routine ©sizeof©:837 The new declaration syntax can be used in other contexts where types are required, \eg casts and the pseudo-routine ©sizeof©: 788 838 \begin{quote2} 789 839 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} … … 805 855 806 856 \CFA also supports a new syntax for routine definition, as well as ISO C and K\&R routine syntax. 807 The point of the new syntax is to allow returning multiple values from a routine~\cite{Galletly96,CLU}, e.g.:857 The point of the new syntax is to allow returning multiple values from a routine~\cite{Galletly96,CLU}, \eg: 808 858 \begin{lstlisting} 809 859 ®[ int o1, int o2, char o3 ]® f( int i1, char i2, char i3 ) { … … 817 867 \Index*{Michael Tiemann}, with help from \Index*{Doug Lea}, provided named return values in g++, circa 1989.} 818 868 The value of each local return variable is automatically returned at routine termination. 819 Declaration qualifiers can only appear at the start of a routine definition, e.g.:869 Declaration qualifiers can only appear at the start of a routine definition, \eg: 820 870 \begin{lstlisting} 821 871 ®extern® [ int x ] g( int y ) {§\,§} … … 849 899 The inability to use \CFA declarations in these two contexts is probably a blessing because it precludes programmers from arbitrarily switching between declarations forms within a declaration contexts. 850 900 851 C-style declarations can be used to declare parameters for \CFA style routine definitions, e.g.:901 C-style declarations can be used to declare parameters for \CFA style routine definitions, \eg: 852 902 \begin{lstlisting} 853 903 [ int ] f( * int, int * ); §\C{// returns an integer, accepts 2 pointers to integers}§ … … 898 948 899 949 The syntax of the new routine prototype declaration follows directly from the new routine definition syntax; 900 as well, parameter names are optional, e.g.:950 as well, parameter names are optional, \eg: 901 951 \begin{lstlisting} 902 952 [ int x ] f (); §\C{// returning int with no parameters}§ … … 906 956 \end{lstlisting} 907 957 This syntax allows a prototype declaration to be created by cutting and pasting source text from the routine definition header (or vice versa). 908 It is possible to declare multiple routine-prototypes in a single declaration, but the entire type specification is distributed across \emph{all} routine names in the declaration list (see~\VRef{s:Declarations}), e.g.:958 It is possible to declare multiple routine-prototypes in a single declaration, but the entire type specification is distributed across \emph{all} routine names in the declaration list (see~\VRef{s:Declarations}), \eg: 909 959 \begin{quote2} 910 960 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} … … 919 969 \end{tabular} 920 970 \end{quote2} 921 Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} e.g.:971 Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} \eg: 922 972 \begin{lstlisting} 923 973 extern [ int ] f (int); … … 928 978 \section{Routine Pointers} 929 979 930 The syntax for pointers to \CFA routines specifies the pointer name on the right, e.g.:980 The syntax for pointers to \CFA routines specifies the pointer name on the right, \eg: 931 981 \begin{lstlisting} 932 982 * [ int x ] () fp; §\C{// pointer to routine returning int with no parameters}§ … … 987 1037 Alternatively, prototype definitions can be eliminated by using a two-pass compilation, and implicitly creating header files for exports. 988 1038 The former is easy to do, while the latter is more complex. 989 Currently, \CFA does \emph{not} attempt to support named arguments. 1039 1040 Furthermore, named arguments do not work well in a \CFA-style programming-languages because they potentially introduces a new criteria for type matching. 1041 For example, it is technically possible to disambiguate between these two overloaded definitions of ©f© based on named arguments at the call site: 1042 \begin{lstlisting} 1043 int f( int i, int j ); 1044 int f( int x, double y ); 1045 1046 f( j : 3, i : 4 ); §\C{// 1st f}§ 1047 f( x : 7, y : 8.1 ); §\C{// 2nd f}§ 1048 f( 4, 5 ); §\C{// ambiguous call}§ 1049 \end{lstlisting} 1050 However, named arguments compound routine resolution in conjunction with conversions: 1051 \begin{lstlisting} 1052 f( i : 3, 5.7 ); §\C{// ambiguous call ?}§ 1053 \end{lstlisting} 1054 Depending on the cost associated with named arguments, this call could be resolvable or ambiguous. 1055 Adding named argument into the routine resolution algorithm does not seem worth the complexity. 1056 Therefore, \CFA does \emph{not} attempt to support named arguments. 990 1057 991 1058 \item[Default Arguments] … … 997 1064 the allowable positional calls are: 998 1065 \begin{lstlisting} 999 p(); §\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§1000 p( 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§1001 p( 4, 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§1002 p( 4, 4, 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 4, 4 )}§1066 p(); §\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§ 1067 p( 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§ 1068 p( 4, 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§ 1069 p( 4, 4, 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 4, 4 )}§ 1003 1070 // empty arguments 1004 p( , 4, 4 ); §\C{// rewrite $\Rightarrow$ p( 1, 4, 4 )}§1005 p( 4, , 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 2, 4 )}§1006 p( 4, 4, ); §\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§1007 p( 4, , ); §\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§1008 p( , 4, ); §\C{// rewrite $\Rightarrow$ p( 1, 4, 3 )}§1009 p( , , 4 ); §\C{// rewrite $\Rightarrow$ p( 1, 2, 4 )}§1010 p( , , ); §\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§1071 p( , 4, 4 ); §\C{// rewrite $\Rightarrow$ p( 1, 4, 4 )}§ 1072 p( 4, , 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 2, 4 )}§ 1073 p( 4, 4, ); §\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§ 1074 p( 4, , ); §\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§ 1075 p( , 4, ); §\C{// rewrite $\Rightarrow$ p( 1, 4, 3 )}§ 1076 p( , , 4 ); §\C{// rewrite $\Rightarrow$ p( 1, 2, 4 )}§ 1077 p( , , ); §\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§ 1011 1078 \end{lstlisting} 1012 1079 Here the missing arguments are inserted from the default values in the parameter list. … … 1043 1110 The conflict occurs because both named and ellipse arguments must appear after positional arguments, giving two possibilities: 1044 1111 \begin{lstlisting} 1045 p( /* positional */, . . ., /* named */ );1046 p( /* positional */, /* named */, . .. );1047 \end{lstlisting} 1048 While it is possible to implement both approaches, the first possibly is more complex than the second, e.g.:1049 \begin{lstlisting} 1050 p( int x, int y, int z, . .. );1051 p( 1, 4, 5, 6, z : 3, y : 2 ); §\C{// assume p( /* positional */, . . ., /* named */ );}§1052 p( 1, z : 3, y : 2, 4, 5, 6 ); §\C{// assume p( /* positional */, /* named */, . .. );}§1112 p( /* positional */, ... , /* named */ ); 1113 p( /* positional */, /* named */, ... ); 1114 \end{lstlisting} 1115 While it is possible to implement both approaches, the first possibly is more complex than the second, \eg: 1116 \begin{lstlisting} 1117 p( int x, int y, int z, ... ); 1118 p( 1, 4, 5, 6, z : 3, y : 2 ); §\C{// assume p( /* positional */, ... , /* named */ );}§ 1119 p( 1, z : 3, y : 2, 4, 5, 6 ); §\C{// assume p( /* positional */, /* named */, ... );}§ 1053 1120 \end{lstlisting} 1054 1121 In the first call, it is necessary for the programmer to conceptually rewrite the call, changing named arguments into positional, before knowing where the ellipse arguments begin. … … 1056 1123 In the second call, the named arguments separate the positional and ellipse arguments, making it trivial to read the call. 1057 1124 1058 The problem is exacerbated with default arguments, e.g.:1059 \begin{lstlisting} 1060 void p( int x, int y = 2, int z = 3. .. );1061 p( 1, 4, 5, 6, z : 3 ); §\C{// assume p( /* positional */, . . ., /* named */ );}§1062 p( 1, z : 3, 4, 5, 6 ); §\C{// assume p( /* positional */, /* named */, . .. );}§1125 The problem is exacerbated with default arguments, \eg: 1126 \begin{lstlisting} 1127 void p( int x, int y = 2, int z = 3... ); 1128 p( 1, 4, 5, 6, z : 3 ); §\C{// assume p( /* positional */, ... , /* named */ );}§ 1129 p( 1, z : 3, 4, 5, 6 ); §\C{// assume p( /* positional */, /* named */, ... );}§ 1063 1130 \end{lstlisting} 1064 1131 The first call is an error because arguments 4 and 5 are actually positional not ellipse arguments; … … 1105 1172 \subsection{Type Nesting} 1106 1173 1107 \CFA allows \Index{type nesting}, and type qualification of the nested typ es (see \VRef[Figure]{f:TypeNestingQualification}), where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification.1174 \CFA allows \Index{type nesting}, and type qualification of the nested typres (see \VRef[Figure]{f:TypeNestingQualification}), where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification. 1108 1175 \begin{figure} 1176 \centering 1109 1177 \begin{tabular}{@{}l@{\hspace{3em}}l|l@{}} 1110 1178 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{C Type Nesting}} & \multicolumn{1}{c}{\textbf{C Implicit Hoisting}} & \multicolumn{1}{|c}{\textbf{\CFA}} \\ … … 1264 1332 1265 1333 As mentioned, tuples can appear in contexts requiring a list of value, such as an argument list of a routine call. 1266 In unambiguous situations, the tuple brackets may be omitted, e.g.,a tuple that appears as an argument may have its1334 In unambiguous situations, the tuple brackets may be omitted, \eg a tuple that appears as an argument may have its 1267 1335 square brackets omitted for convenience; therefore, the following routine invocations are equivalent: 1268 1336 \begin{lstlisting} … … 1303 1371 1304 1372 Type qualifiers, i.e., const and volatile, may modify a tuple type. 1305 The meaning is the same as for a type qualifier modifying an aggregate type [Int99, x 6.5.2.3(7),x 6.7.3(11)], i.e., the qualifier is distributed across all of the types in the tuple, e.g.:1373 The meaning is the same as for a type qualifier modifying an aggregate type [Int99, x 6.5.2.3(7),x 6.7.3(11)], i.e., the qualifier is distributed across all of the types in the tuple, \eg: 1306 1374 \begin{lstlisting} 1307 1375 const volatile [ int, float, const int ] x; … … 1311 1379 [ const volatile int, const volatile float, const volatile int ] x; 1312 1380 \end{lstlisting} 1313 Declaration qualifiers can only appear at the start of a \CFA tuple declaration4, e.g.:1381 Declaration qualifiers can only appear at the start of a \CFA tuple declaration4, \eg: 1314 1382 \begin{lstlisting} 1315 1383 extern [ int, int ] w1; … … 1319 1387 Unfortunately, C's syntax for subscripts precluded treating them as tuples. 1320 1388 The C subscript list has the form ©[i][j]...© and not ©[i, j, ...]©. 1321 Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, e.g.,©f[g()]© always means a single subscript value because there is only one set of brackets.1389 Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, \eg ©f[g()]© always means a single subscript value because there is only one set of brackets. 1322 1390 Fixing this requires a major change to C because the syntactic form ©M[i, j, k]© already has a particular meaning: ©i, j, k© is a comma expression. 1323 1391 \end{rationale} … … 1373 1441 Mass assignment has the following form: 1374 1442 \begin{lstlisting} 1375 [ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = §\emph{expr}§;1443 [ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = §\emph{expr}§; 1376 1444 \end{lstlisting} 1377 1445 \index{lvalue} … … 1380 1448 Clearly, the types of the entities being assigned must be type compatible with the value of the expression. 1381 1449 1382 Mass assignment has parallel semantics, e.g.,the statement:1450 Mass assignment has parallel semantics, \eg the statement: 1383 1451 \begin{lstlisting} 1384 1452 [ x, y, z ] = 1.5; … … 1413 1481 Multiple assignment has the following form: 1414 1482 \begin{lstlisting} 1415 [ §\emph{lvalue}§, . . ., §\emph{lvalue}§ ] = [ §\emph{expr}§, . . ., §\emph{expr}§ ];1483 [ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = [ §\emph{expr}§, ... , §\emph{expr}§ ]; 1416 1484 \end{lstlisting} 1417 1485 \index{lvalue} … … 1469 1537 \section{Unnamed Structure Fields} 1470 1538 1471 C requires each field of a structure to have a name, except for a bit field associated with a basic type, e.g.:1539 C requires each field of a structure to have a name, except for a bit field associated with a basic type, \eg: 1472 1540 \begin{lstlisting} 1473 1541 struct { 1474 int f1; // named field1475 int f2 : 4; // named field with bit field size1476 int : 3; // unnamed field for basic type with bit field size1477 int ; // disallowed, unnamed field1478 int *; // disallowed, unnamed field1479 int (*)(int); // disallowed, unnamed field1542 int f1; §\C{// named field}§ 1543 int f2 : 4; §\C{// named field with bit field size}§ 1544 int : 3; §\C{// unnamed field for basic type with bit field size}§ 1545 int ; §\C{// disallowed, unnamed field}§ 1546 int *; §\C{// disallowed, unnamed field}§ 1547 int (*)(int); §\C{// disallowed, unnamed field}§ 1480 1548 }; 1481 1549 \end{lstlisting} 1482 1550 This requirement is relaxed by making the field name optional for all field declarations; therefore, all the field declarations in the example are allowed. 1483 1551 As for unnamed bit fields, an unnamed field is used for padding a structure to a particular size. 1484 A list of unnamed fields is also supported, e.g.:1552 A list of unnamed fields is also supported, \eg: 1485 1553 \begin{lstlisting} 1486 1554 struct { 1487 int , , ; // 3 unnamed fields1555 int , , ; §\C{// 3 unnamed fields}§ 1488 1556 } 1489 1557 \end{lstlisting} … … 1498 1566 §\emph{expr}§ -> [ §\emph{fieldlist}§ ] 1499 1567 \end{lstlisting} 1500 \emph{expr} is any expression yielding a value of type record, e.g.,©struct©, ©union©.1568 \emph{expr} is any expression yielding a value of type record, \eg ©struct©, ©union©. 1501 1569 Each element of \emph{ fieldlist} is an element of the record specified by \emph{expr}. 1502 1570 A record-field tuple may be used anywhere a tuple can be used. An example of the use of a record-field tuple is … … 1760 1828 } 1761 1829 \end{lstlisting} 1762 While the declaration of the local variable ©y© is useful and its scope is across all ©case© clauses, the initialization for such a variable is defined to never be executed because control always transfers over it. 1763 Furthermore, any statements before the first ©case© clause can only be executed if labelled and transferred to using a ©goto©, either from outside or inside of the ©switch©. 1764 As mentioned, transfer into control structures should be forbidden; 1765 transfers from within the ©switch© body using a ©goto© are equally unpalatable. 1766 As well, the declaration of ©z© is cannot occur after the ©case© because a label can only be attached to a statement, and without a fall through to case 3, ©z© is uninitialized. 1830 While the declaration of the local variable ©y© is useful with a scope across all ©case© clauses, the initialization for such a variable is defined to never be executed because control always transfers over it. 1831 Furthermore, any statements before the first ©case© clause can only be executed if labelled and transferred to using a ©goto©, either from outside or inside of the ©switch©, both of which are problematic. 1832 As well, the declaration of ©z© cannot occur after the ©case© because a label can only be attached to a statement, and without a fall through to case 3, ©z© is uninitialized. 1833 The key observation is that the ©switch© statement branches into control structure, i.e., there are multiple entry points into its statement body. 1767 1834 \end{enumerate} 1768 1835 … … 1778 1845 and there is only a medium amount of fall-through from one ©case© clause to the next, and most of these result from a list of case values executing common code, rather than a sequence of case actions that compound. 1779 1846 \end{itemize} 1780 These observations help to put the suggestedchanges to the ©switch© into perspective.1847 These observations help to put the \CFA changes to the ©switch© into perspective. 1781 1848 \begin{enumerate} 1782 1849 \item 1783 1850 Eliminating default fall-through has the greatest potential for affecting existing code. 1784 However, even if fall-through is removed, most ©switch© statements would continue to work because of the explicit transfers already present at the end of each ©case© clause, the common placement of the ©default© clause at the end of the case list, and the most common use of fall-through, i.e., a list of ©case© clauses executing common code, e.g.:1785 \begin{lstlisting}1851 However, even if fall-through is removed, most ©switch© statements would continue to work because of the explicit transfers already present at the end of each ©case© clause, the common placement of the ©default© clause at the end of the case list, and the most common use of fall-through, i.e., a list of ©case© clauses executing common code, \eg: 1852 \begin{lstlisting} 1786 1853 case 1: case 2: case 3: ... 1787 1854 \end{lstlisting} 1788 1855 still work. 1789 1856 Nevertheless, reversing the default action would have a non-trivial effect on case actions that compound, such as the above example of processing shell arguments. 1790 Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthru©, e.g.: 1857 <<<<<<< HEAD 1858 Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthru©, \eg: 1859 ======= 1860 Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthrough©/©fallthru©, e.g.: 1861 >>>>>>> 080615890f586cb9954c252b55cab47f52c25758 1791 1862 \begin{lstlisting} 1792 1863 ®choose® ( i ) { … … 1815 1886 Therefore, no change is made for this issue. 1816 1887 \item 1817 Dealing with unreachable code in a ©switch©/©choose© body is solved by restricting declarations and associated initialization to the start of statement body, which is executed \emph{before} the transfer to the appropriate ©case© clause .\footnote{1818 Essentially, these declarations are hoisted before the statement and both declarations and statement are surrounded by a compound statement.} and precluding statements before the first ©case© clause.1819 Further declaration in the statement body are disallowed.1888 Dealing with unreachable code in a ©switch©/©choose© body is solved by restricting declarations and associated initialization to the start of statement body, which is executed \emph{before} the transfer to the appropriate ©case© clause\footnote{ 1889 Essentially, these declarations are hoisted before the ©switch©/©choose© statement and both declarations and statement are surrounded by a compound statement.} and precluding statements before the first ©case© clause. 1890 Further declarations at the same nesting level as the statement body are disallowed to ensure every transfer into the body is sound. 1820 1891 \begin{lstlisting} 1821 1892 switch ( x ) { 1822 ®int i = 0;® §\C{// allowed }§1893 ®int i = 0;® §\C{// allowed only at start}§ 1823 1894 case 0: 1824 1895 ... 1825 ®int i= 0;® §\C{// disallowed}§1896 ®int j = 0;® §\C{// disallowed}§ 1826 1897 case 1: 1827 1898 { 1828 ®int i = 0;® §\C{// allowed in any compound statement}§1899 ®int k = 0;® §\C{// allowed at different nesting levels}§ 1829 1900 ... 1830 1901 } … … 1846 1917 \begin{lstlisting} 1847 1918 switch ( i ) { 1848 ®case1, 3, 5®:1919 case ®1, 3, 5®: 1849 1920 ... 1850 ®case2, 4, 6®:1921 case ®2, 4, 6®: 1851 1922 ... 1852 1923 } … … 1879 1950 \begin{lstlisting} 1880 1951 switch ( i ) { 1881 ®case1~5:®1952 case ®1~5:® 1882 1953 ... 1883 ®case10~15:®1954 case ®10~15:® 1884 1955 ... 1885 1956 } … … 1888 1959 \begin{lstlisting} 1889 1960 switch ( i ) 1890 case 1 ... 5:1961 case ®1 ... 5®: 1891 1962 ... 1892 case 10 ... 15:1963 case ®10 ... 15®: 1893 1964 ... 1894 1965 } … … 2707 2778 Like the \Index*[C++]{\CC} lexical problem with closing template-syntax, e.g, ©Foo<Bar<int®>>®©, this issue can be solved with a more powerful lexer/parser. 2708 2779 2709 There are several ambiguous cases with operator identifiers, e.g.,©int *?*?()©, where the string ©*?*?© can be lexed as ©*©/©?*?© or ©*?©/©*?©.2710 Since it is common practise to put a unary operator juxtaposed to an identifier, e.g.,©*i©, users will be annoyed if they cannot do this with respect to operator identifiers.2780 There are several ambiguous cases with operator identifiers, \eg ©int *?*?()©, where the string ©*?*?© can be lexed as ©*©/©?*?© or ©*?©/©*?©. 2781 Since it is common practise to put a unary operator juxtaposed to an identifier, \eg ©*i©, users will be annoyed if they cannot do this with respect to operator identifiers. 2711 2782 Even with this special hack, there are 5 general cases that cannot be handled. 2712 2783 The first case is for the function-call identifier ©?()©: … … 2773 2844 This means that a function requiring mutual exclusion could block if the lock is already held by another thread. 2774 2845 Blocking on a monitor lock does not block the kernel thread, it simply blocks the user thread, which yields its kernel thread while waiting to obtain the lock. 2775 If multiple mutex parameters are specified, they will be locked in parameter order ( i.e.first parameter is locked first) and unlocked in the2846 If multiple mutex parameters are specified, they will be locked in parameter order (\ie first parameter is locked first) and unlocked in the 2776 2847 reverse order. 2777 2848 \begin{lstlisting} … … 4350 4421 \begin{description} 4351 4422 \item[Change:] add new keywords \\ 4352 New keywords are added to \CFA .4423 New keywords are added to \CFA (see~\VRef{s:NewKeywords}). 4353 4424 \item[Rationale:] keywords added to implement new semantics of \CFA. 4354 4425 \item[Effect on original feature:] change to semantics of well-defined feature. \\ 4355 4426 Any ISO C programs using these keywords as identifiers are invalid \CFA programs. 4356 \item[Difficulty of converting:] keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism: 4357 \begin{lstlisting} 4358 int `otype` = 3; // make keyword an identifier 4359 double `choose` = 3.5; 4360 \end{lstlisting} 4361 Programs can be converted automatically by enclosing keyword identifiers in backquotes, and the backquotes can be remove later when the identifier name is changed. 4362 Clashes in C system libraries (include files) can be handled automatically using preprocessor, ©#include_next© and ©-Ifilename©: 4363 \begin{lstlisting} 4364 // include file uses the CFA keyword "otype". 4365 #if ! defined( otype ) // nesting ? 4366 #define otype `otype` 4367 #define __CFA_BFD_H__ 4368 #endif // ! otype 4369 4370 #include_next <bfd.h> // must have internal check for multiple expansion 4371 4372 #if defined( otype ) && defined( __CFA_BFD_H__ ) // reset only if set 4373 #undef otype 4374 #undef __CFA_BFD_H__ 4375 #endif // otype && __CFA_BFD_H__ 4376 \end{lstlisting} 4427 \item[Difficulty of converting:] keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism (see~\VRef{s:BackquoteIdentifiers}): 4377 4428 \item[How widely used:] clashes among new \CFA keywords and existing identifiers are rare. 4378 4429 \end{description} … … 4384 4435 int rtn( int i ); 4385 4436 int rtn( char c ); 4386 rtn( 'x' ); // programmer expects 2nd rtn to be called4437 rtn( 'x' ); §\C{// programmer expects 2nd rtn to be called}§ 4387 4438 \end{lstlisting} 4388 4439 \item[Rationale:] it is more intuitive for the call to ©rtn© to match the second version of definition of ©rtn© rather than the first. … … 4406 4457 \item[Change:] make string literals ©const©: 4407 4458 \begin{lstlisting} 4408 char * p = "abc"; // valid in C, deprecated in §\CFA§4409 char * q = expr ? "abc" : "de"; // valid in C, invalid in §\CFA§4459 char * p = "abc"; §\C{// valid in C, deprecated in \CFA}§ 4460 char * q = expr ? "abc" : "de"; §\C{// valid in C, invalid in \CFA}§ 4410 4461 \end{lstlisting} 4411 4462 The type of a string literal is changed from ©[] char© to ©const [] char©. … … 4414 4465 \begin{lstlisting} 4415 4466 char * p = "abc"; 4416 p[0] = 'w'; // segment fault or change constant literal4467 p[0] = 'w'; §\C{// segment fault or change constant literal}§ 4417 4468 \end{lstlisting} 4418 4469 The same problem occurs when passing a string literal to a routine that changes its argument. … … 4426 4477 \item[Change:] remove \newterm{tentative definitions}, which only occurs at file scope: 4427 4478 \begin{lstlisting} 4428 int i; // forward definition4429 int *j = ®&i®; // forward reference, valid in C, invalid in §\CFA§4430 int i = 0; // definition4479 int i; §\C{// forward definition}§ 4480 int *j = ®&i®; §\C{// forward reference, valid in C, invalid in \CFA}§ 4481 int i = 0; §\C{// definition}§ 4431 4482 \end{lstlisting} 4432 4483 is valid in C, and invalid in \CFA because duplicate overloaded object definitions at the same scope level are disallowed. … … 4434 4485 \begin{lstlisting} 4435 4486 struct X { int i; struct X *next; }; 4436 static struct X a; // forward definition4437 static struct X b = { 0, ®&a® }; // forward reference, valid in C, invalid in §\CFA§4438 static struct X a = { 1, &b }; // definition4487 static struct X a; §\C{// forward definition}§ 4488 static struct X b = { 0, ®&a® }; §\C{// forward reference, valid in C, invalid in \CFA}§ 4489 static struct X a = { 1, &b }; §\C{// definition}§ 4439 4490 \end{lstlisting} 4440 4491 \item[Rationale:] avoids having different initialization rules for builtin types and userdefined types. … … 4446 4497 \item 4447 4498 \begin{description} 4448 \item[Change:] have ©struct© introduce a scope for nested types 4449 In C, the name of the nested types belongs to the same scope as the name of the outermost enclosing 4450 Example: 4499 \item[Change:] have ©struct© introduce a scope for nested types: 4451 4500 \begin{lstlisting} 4452 4501 enum ®Colour® { R, G, B, Y, C, M }; 4453 4502 struct Person { 4454 enum ®Colour® { R, G, B }; // nested type4455 struct Face { // nested type4456 ®Colour® Eyes, Hair; // type defined outside (1 level)4503 enum ®Colour® { R, G, B }; §\C{// nested type}§ 4504 struct Face { §\C{// nested type}§ 4505 ®Colour® Eyes, Hair; §\C{// type defined outside (1 level)}§ 4457 4506 }; 4458 ß.ß®Colour® shirt; // type defined outside (top level)4459 ®Colour® pants; // type defined same level4460 Face looks[10]; // type defined same level4507 ß.ß®Colour® shirt; §\C{// type defined outside (top level)}§ 4508 ®Colour® pants; §\C{// type defined same level}§ 4509 Face looks[10]; §\C{// type defined same level}§ 4461 4510 }; 4462 ®Colour® c = R; // type/enum defined same level 4463 Personß.ß®Colour® pc = Personß.ßR; // type/enum defined inside 4464 Personß.ßFace pretty; // type defined inside 4465 \end{lstlisting} 4511 ®Colour® c = R; §\C{// type/enum defined same level}§ 4512 Personß.ß®Colour® pc = Personß.ßR; §\C{// type/enum defined inside}§ 4513 Personß.ßFace pretty; §\C{// type defined inside}§ 4514 \end{lstlisting} 4515 In C, the name of the nested types belongs to the same scope as the name of the outermost enclosing structure, i.e., the nested types are hoisted to the scope of the outer-most type, which is not useful and confusing. 4516 \CFA is C \emph{incompatible} on this issue, and provides semantics similar to \Index*[C++]{\CC}. 4517 Nested types are not hoisted and can be referenced using the field selection operator ``©.©'', unlike the \CC scope-resolution operator ``©::©''. 4466 4518 \item[Rationale:] ©struct© scope is crucial to \CFA as an information structuring and hiding mechanism. 4467 4519 \item[Effect on original feature:] change to semantics of well-defined feature. 4468 4520 \item[Difficulty of converting:] Semantic transformation. 4469 4521 \item[How widely used:] C programs rarely have nest types because they are equivalent to the hoisted version. 4470 4471 \CFA is C \emph{incompatible} on this issue, and provides semantics similar to \Index*[C++]{\CC}.4472 Nested types are not hoisted and can be referenced using the field selection operator ``©.©'', unlike the \CC scope-resolution operator ``©::©''.4473 Given that nested types in C are equivalent to not using them, i.e., they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility.4474 4522 \end{description} 4475 4523 … … 4480 4528 \item[Difficulty of converting:] Semantic transformation. To make the struct type name visible in the scope of the enclosing struct, the struct tag could be declared in the scope of the enclosing struct, before the enclosing struct is defined. Example: 4481 4529 \begin{lstlisting} 4482 struct Y; // struct Y and struct X are at the same scope4530 struct Y; §\C{// struct Y and struct X are at the same scope}§ 4483 4531 struct X { 4484 4532 struct Y { /* ... */ } y; … … 4501 4549 4502 4550 4551 \section{New Keywords} 4552 \label{s:NewKeywords} 4553 4554 \begin{quote2} 4555 \begin{tabular}{lll} 4556 ©catch© & ©fallthrough© & ©otype© \\ 4557 ©catchResume© & ©fallthru© & ©throw© \\ 4558 ©choose© & ©finally© & ©throwResume© \\ 4559 ©disable© & ©forall© & ©trait© \\ 4560 ©dtype© & ©ftype© & ©try© \\ 4561 ©enable© & ©lvalue© & \\ 4562 \end{tabular} 4563 \end{quote2} 4564 4565 4566 \section{Standard Headers} 4567 \label{s:StandardHeaders} 4568 4569 C prescribes the following standard header-files~\cite[\S~7.1.2]{C11}: 4570 \begin{quote2} 4571 \begin{minipage}{\linewidth} 4572 \begin{tabular}{lll} 4573 assert.h & math.h & stdlib.h \\ 4574 complex.h & setjmp.h & stdnoreturn.h \\ 4575 ctype.h & signal.h & string.h \\ 4576 errno.h & stdalign.h & tgmath.h \\ 4577 fenv.h & stdarg.h & threads.h \\ 4578 float.h & stdatomic.h & time.h \\ 4579 inttypes.h & stdbool.h & uchar.h \\ 4580 iso646.h & stddef.h & wchar.h \\ 4581 limits.h & stdint.h & wctype.h \\ 4582 locale.h & stdio.h & unistd.h\footnote{\CFA extension} 4583 \end{tabular} 4584 \end{minipage} 4585 \end{quote2} 4586 For the prescribed head-files, \CFA implicitly wraps their includes in an ©extern "C"©; 4587 hence, names in these include files are not mangled\index{mangling!name} (see~\VRef{s:Interoperability}). 4588 All other C header files must be explicitly wrapped in ©extern "C"© to prevent name mangling. 4589 4590 4503 4591 \section{I/O Library} 4504 4592 \label{s:IOLibrary} … … 4570 4658 %$ 4571 4659 \begin{lstlisting}[mathescape=off] 4572 sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¡" | 7 | "x ¿" | 8 | "x «" | 9 | endl; 4660 sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¡" | 7 4661 | "x ¿" | 8 | "x «" | 9 | endl; 4573 4662 \end{lstlisting} 4574 4663 %$ … … 4580 4669 A seperator does not appear after a C string ending with the (extended) \Index{ASCII}\index{ASCII!extended} characters: ©,.:;!?)]}%¢»© 4581 4670 \begin{lstlisting}[belowskip=0pt] 4582 sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 | ") x" | 8 | "] x" | 9 | "} x"4583 | 10 | "% x" | 11 | "¢ x" | 12 | "» x" | endl;4671 sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 4672 | ") x" | 8 | "] x" | 9 | "} x" | 10 | "% x" | 11 | "¢ x" | 12 | "» x" | endl; 4584 4673 \end{lstlisting} 4585 4674 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4597 4686 The following \CC-style \Index{manipulator}s allow further control over implicit seperation. 4598 4687 \begin{lstlisting}[mathescape=off,belowskip=0pt] 4599 sout | sepOn | 1 | 2 | 3 | sepOn | endl; // separator at start of line4688 sout | sepOn | 1 | 2 | 3 | sepOn | endl; §\C{// separator at start of line}§ 4600 4689 \end{lstlisting} 4601 4690 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4603 4692 \end{lstlisting} 4604 4693 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt] 4605 sout | 1 | sepOff | 2 | 3 | endl; // turn off implicit separator temporarily4694 sout | 1 | sepOff | 2 | 3 | endl; §\C{// turn off implicit separator temporarily}§ 4606 4695 \end{lstlisting} 4607 4696 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4609 4698 \end{lstlisting} 4610 4699 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt] 4611 sout | sepDisable | 1 | 2 | 3 | endl; // turn off implicit separation, affects all subsequent prints4700 sout | sepDisable | 1 | 2 | 3 | endl; §\C{// turn off implicit separation, affects all subsequent prints}§ 4612 4701 \end{lstlisting} 4613 4702 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4615 4704 \end{lstlisting} 4616 4705 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt] 4617 sout | 1 | sepOn | 2 | 3 | endl; // turn on implicit separator temporarily4706 sout | 1 | sepOn | 2 | 3 | endl; §\C{// turn on implicit separator temporarily}§ 4618 4707 \end{lstlisting} 4619 4708 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4621 4710 \end{lstlisting} 4622 4711 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt] 4623 sout | sepEnable | 1 | 2 | 3 | endl; // turn on implicit separation, affects all subsequent prints4712 sout | sepEnable | 1 | 2 | 3 | endl; §\C{// turn on implicit separation, affects all subsequent prints}§ 4624 4713 \end{lstlisting} 4625 4714 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4627 4716 \end{lstlisting} 4628 4717 \begin{lstlisting}[mathescape=off,aboveskip=0pt,aboveskip=0pt,belowskip=0pt] 4629 sepSet( sout, ", $" ); // change separator from " " to ", $"4718 sepSet( sout, ", $" ); §\C{// change separator from " " to ", \$"}§ 4630 4719 sout | 1 | 2 | 3 | endl; 4631 4720 \end{lstlisting} … … 4673 4762 \subsection{malloc} 4674 4763 4764 \leavevmode 4675 4765 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4676 4766 forall( otype T ) T * malloc( void );§\indexc{malloc}§ … … 4689 4779 forall( otype T ) T * memset( T * ptr ); // remove when default value available 4690 4780 \end{lstlisting} 4691 \ 4781 4692 4782 4693 4783 \subsection{ato / strto} 4694 4784 4785 \leavevmode 4695 4786 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4696 4787 int ato( const char * ptr );§\indexc{ato}§ … … 4720 4811 long double _Complex strto( const char * sptr, char ** eptr ); 4721 4812 \end{lstlisting} 4722 \4723 4813 4724 4814 4725 4815 \subsection{bsearch / qsort} 4726 4816 4817 \leavevmode 4727 4818 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4728 4819 forall( otype T | { int ?<?( T, T ); } ) … … 4732 4823 void qsort( const T * arr, size_t dimension );§\indexc{qsort}§ 4733 4824 \end{lstlisting} 4734 \4735 4825 4736 4826 4737 4827 \subsection{abs} 4738 4828 4829 \leavevmode 4739 4830 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4740 4831 char abs( char );§\indexc{abs}§ … … 4749 4840 long double abs( long double _Complex ); 4750 4841 \end{lstlisting} 4751 \4752 4842 4753 4843 4754 4844 \subsection{random} 4755 4845 4846 \leavevmode 4756 4847 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4757 4848 void rand48seed( long int s );§\indexc{rand48seed}§ … … 4767 4858 long double _Complex rand48(); 4768 4859 \end{lstlisting} 4769 \4770 4860 4771 4861 4772 4862 \subsection{min / max / clamp / swap} 4773 4863 4864 \leavevmode 4774 4865 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4775 4866 forall( otype T | { int ?<?( T, T ); } ) … … 4785 4876 void swap( T * t1, T * t2 );§\indexc{swap}§ 4786 4877 \end{lstlisting} 4787 \4788 4878 4789 4879 … … 4796 4886 \subsection{General} 4797 4887 4888 \leavevmode 4798 4889 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4799 4890 float fabs( float );§\indexc{fabs}§ … … 4841 4932 long double nan( const char * ); 4842 4933 \end{lstlisting} 4843 \4844 4934 4845 4935 4846 4936 \subsection{Exponential} 4847 4937 4938 \leavevmode 4848 4939 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4849 4940 float exp( float );§\indexc{exp}§ … … 4898 4989 long double logb( long double ); 4899 4990 \end{lstlisting} 4900 \4901 4991 4902 4992 4903 4993 \subsection{Power} 4904 4994 4995 \leavevmode 4905 4996 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4906 4997 float sqrt( float );§\indexc{sqrt}§ … … 4926 5017 long double _Complex pow( long double _Complex, long double _Complex ); 4927 5018 \end{lstlisting} 4928 \4929 5019 4930 5020 4931 5021 \subsection{Trigonometric} 4932 5022 5023 \leavevmode 4933 5024 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4934 5025 float sin( float );§\indexc{sin}§ … … 4982 5073 long double atan( long double, long double ); 4983 5074 \end{lstlisting} 4984 \4985 5075 4986 5076 4987 5077 \subsection{Hyperbolic} 4988 5078 5079 \leavevmode 4989 5080 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 4990 5081 float sinh( float );§\indexc{sinh}§ … … 5030 5121 long double _Complex atanh( long double _Complex ); 5031 5122 \end{lstlisting} 5032 \5033 5123 5034 5124 5035 5125 \subsection{Error / Gamma} 5036 5126 5127 \leavevmode 5037 5128 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 5038 5129 float erf( float );§\indexc{erf}§ … … 5061 5152 long double tgamma( long double ); 5062 5153 \end{lstlisting} 5063 \5064 5154 5065 5155 5066 5156 \subsection{Nearest Integer} 5067 5157 5158 \leavevmode 5068 5159 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 5069 5160 float floor( float );§\indexc{floor}§ … … 5115 5206 long long int llround( long double ); 5116 5207 \end{lstlisting} 5117 \5118 5208 5119 5209 5120 5210 \subsection{Manipulation} 5121 5211 5212 \leavevmode 5122 5213 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 5123 5214 float copysign( float, float );§\indexc{copysign}§ … … 5156 5247 long double scalbln( long double, long int ); 5157 5248 \end{lstlisting} 5158 \5159 5249 5160 5250 … … 5162 5252 \label{s:RationalNumbers} 5163 5253 5164 Rational numbers are numbers written as a ratio, i.e.,as a fraction, where the numerator (top number) and the denominator (bottom number) are whole numbers.5254 Rational numbers are numbers written as a ratio, \ie as a fraction, where the numerator (top number) and the denominator (bottom number) are whole numbers. 5165 5255 When creating and computing with rational numbers, results are constantly reduced to keep the numerator and denominator as small as possible. 5166 5256
Note:
See TracChangeset
for help on using the changeset viewer.