|
|
1.1 root 1: (C) Copyright Microsoft Corporation, 1987
2: Microsoft(R) Operating System/2(R) Software Development Kit
3: README.DOC
4:
5:
6: This document contains information about Version 5.10 of the Microsoft C
7: Optimizing Compiler and libraries for MS-DOS(R). The information contained
8: in this document is more up to date than that in the printed manuals.
9: As a result, where information in the manuals conflicts with information in
10: this document, this document should be assumed to contain the correct
11: information.
12:
13: REQUESTING ASSISTANCE FROM MICROSOFT
14:
15: If you need to contact Microsoft Product Support for assistance, the
16: four-digit phone code for the Microsoft C Optimizing Compiler is 1222.
17:
18:
19: OTHER ON-LINE DOCUMENTS
20:
21: For additional information, consult the following files:
22:
23: File Disk Contents
24: ---- ---- --------
25: ERRMSG.DOC 1 New and changed error messages
26: FPEXCEPT.DOC 1 Information about handling
27: floating-point exceptions
28: SETUP.DOC 1 Information about SETUP program
29:
30: \PATCH\README.DOC 2 DOS 3.2 patch information
31:
32: \STARTUP\README.DOC 3 Information about start-up source files
33:
34: \SOURCE\CFLOW.DOC 9 Information about CFLOW.C demo program
35:
36:
37:
38: INSTALLING AND BUILDING COMBINED LIBRARIES
39:
40: The LIBBUILD program creates combined C libraries. The Software Development
41: Kit (SDK) does not include a SETUP program to install the compiler software.
42: You will need to run the LIBBUILD program to create combined C libraries;
43: otherwise, you must override library search records each time you link,
44: by using the /NOD option. You can use LIBBUILD at any time to create
45: more combined C libraries.
46:
47: To run LIBBUILD, type a command line of the following form:
48:
49: libbuild <mem> <fp> [gr] <dest>
50:
51: The arguments you type on the command line are described below. (These
52: arguments may be either uppercase or lowercase.)
53:
54: Argument Description
55: -------- -----------
56: <mem> Specifies the memory model. Type S for small, M for
57: medium, C for compact, or L for large model.
58:
59: <fp> Specifies the floating-point math package. Type EM for
60: the emulator, 87 for the 8087/80287/80387 package, or
61: A for the alternate math package.
62:
63: [gr] Tells LIBBUILD whether or not you want the graphics-
64: library package added to your library. Type GR if you
65: do; otherwise, omit this argument.
66:
67: <dest> Directory where the initial (release-disk) .LIB
68: files can be found. This is also the directory
69: where your combined library will reside. Type a
70: complete path name, including a drive designation.
71:
72: LIBBUILD asks if you want to build the combined library from components
73: that reside on your hard disk or from components on the C disk set.
74: If you specify the C disk set, LIBBUILD prompts you to insert
75: the C 5.10 diskettes as needed.
76:
77: See Chapter 2 of the Microsoft C Optimizing Compiler User's Guide for more
78: information about combined libraries.
79:
80: Compiling and Linking Combined Libraries
81: ----------------------------------------
82: If you link with the CL driver, giving the /Lc or /Lp option, then CL will
83: automatically link in the correct libraries. However, if you link separately
84: by directly invoking LINK, then you must specify the name of your combined
85: library in the LINK command line. If you link a protected mode program,
86: then you need to specify both the name of the library, and the file
87: DOSCALLS.LIB in the LINK command line. Examples:
88:
89: LINK sample.obj,,SLIBC3.LIB;
90: LINK psample.obj,,MLIBCP.LIB+DOSCALLS.LIB;
91:
92:
93:
94: DIFFERENCES FROM VERSION 4.0
95:
96: memcpy function
97: ----------------
98: As noted in the Microsoft C Run-Time Library Reference, in Version 5.10 of
99: Microsoft C the memcpy function does NOT ensure that overlapping regions
100: are copied before they are overwritten. The memmove function should be
101: used in cases where overlapping regions of memory must be copied.
102:
103: If you need to ensure that memcpy exhibits its original behavior, include the
104: following #define directive in your source program:
105:
106: #define memcpy(d,s,n) memmove(d,s,n)
107:
108: MSC Driver
109: ----------
110: The MSC compiler driver is not supported in Version 5.10 of the Microsoft C
111: Optimizing Compiler. If you have batch files in which you use the MSC
112: command, you can make the following global changes to the MSC command lines
113: to ensure that your programs will be compiled the same:
114:
115: 1. Replace any MSC command with a CL command.
116:
117: 2. Replace the terminating semicolon on the MSC command line with the /c
118: (compile-only) CL option.
119:
120: 3. If commas appear on the MSC command line:
121:
122: Replace the first comma (preceding the object-file name) with /Fo.
123: (This step is not required if no file name follows the first comma;
124: that is, if the comma is simply used as a placeholder.)
125:
126: Replace the second comma (preceding the source-listing-file name)
127: with /Fs.
128:
129: Replace the third comma (preceding the object-listing-file name)
130: with /Fc.
131:
132: Note that each of these options must appear immediately before the
133: corresponding file name, with no intervening spaces.
134:
135: For example, to convert the MSC command line
136:
137: MSC test.c,,,;
138:
139: to a CL command line, follow these steps:
140:
141: 1. Replace the MSC command with a CL command, giving
142:
143: CL test.c,,,;
144:
145: 2. Replace the semicolon with the /c option, giving
146:
147: CL test.c,,src.lst, /c
148:
149: 3. Since no object-file name follows the first comma, you do not need to
150: add an /Fo option. Replace the first comma with a blank and the second
151: comma with an /Fs option, giving
152:
153: CL test.c /Fssrc.lst, /c
154:
155: 4. Replace the second comma with an /Fc option, giving
156:
157: CL test.c /Fssrc.lst /Fc /c
158:
159: Parameter-Type Lists in Function Prototypes
160: -------------------------------------------
161: To conform with the ANSI standard, parameter-type lists in a function prototype
162: must match the corresponding function definition in types and number of
163: parameters and in the use of ellipsis terminators. Thus, code such as the
164: following, which was legal in Version 4.0, generates warning messages in
165: Version 5.10:
166:
167: int func(int,...); /* prototype: ellipsis terminator */
168:
169: int func(x, y, z) /* definition: no ellipsis terminator */
170: int x, y, z;
171: {
172: }
173:
174: Function Prototypes/Definitions with Float Arguments
175: ----------------------------------------------------
176: In Version 4.0 of Microsoft C, the following code fragment apparently specified
177: a function that expected an argument of type float:
178:
179: void takesfloat(float);
180: .
181: .
182: .
183: void takesfloat(f)
184: float f;
185: {
186: .
187: .
188: .
189: }
190:
191: However, C as defined by Kernighan and Ritchie did not actually support float
192: (single-precision) arithmetic (unless double and float were both
193: single-precision). Therefore, the argument was assumed to be of type double
194: in both cases and the compiler simply made the change.
195:
196: Under ANSI C, which specifically allows single-precision arithmetic,
197: you can now pass single-precision actual arguments. However, a change
198: made to support this feature in Version 5.10 of Microsoft C may require
199: you to change existing code and recompile.
200:
201: When compiled with Version 5.10, the code fragment above causes a warning
202: about a parameter mismatch between the prototype and the definition of the
203: takesfloat function. ALTHOUGH THIS IS A WARNING RATHER THAN AN ERROR, THE
204: RESULTING CODE WILL NOT WORK CORRECTLY.
205:
206: The problem is that ANSI C considers old- and new-style function definitions
207: to be different. In particular, old-style definitions, such as the definition
208: in the fragment above, are forced to widen type-float arguments to type
209: double. Thus, the fragment generates the parameter-mismatch error because
210: the prototype specifies a type-float argument and the definition specifies a
211: type-double argument. However a new-style definition, such as
212:
213: void takesfloat(float f)
214: {
215: .
216: .
217: .
218: }
219:
220: accepts the narrower argument type.
221:
222: If you have code of this kind that causes parameter-mismatch problems,
223: you have two possible solutions, depending on whether the desired
224: argument type is actually float or double:
225:
226: 1. If you want type-double arguments, then change argument types in the
227: prototype to double. (Also change the definition if you use the /Zg option
228: to generate the prototypes and you want to clarify the change for anyone
229: who will read the code later.)
230:
231: 2. If you want type-float arguments, change the definition to use the
232: new-style format illustrated above.
233:
234: If the code must be portable to other (non-ANSI) C compilers, you must use
235: solution 1, since such compilers will not handle the new-style definitions.
236:
237:
238: NEW AND CHANGED FEATURES
239:
240: The following notes describe important new and changed features in the
241: Microsoft C Optimizing Compiler and in the software provided with the compiler.
242:
243:
244: Start-Up Code
245:
246: Assembling Start-Up Files
247: -------------------------
248: The start-up files provided with Version 5.10 of Microsoft C should be assembled
249: with Version 4.0 or later of the Microsoft Macro Assembler (MASM).
250:
251: Open File Handles
252: -----------------
253: Version 5.10 of Microsoft C supports more than 20 open file handles. This
254: feature can be used beginning with DOS Version 3.3.
255:
256: Use the following procedure to set a larger upper limit on the number of
257: file handles:
258:
259: 1. Edit the startup source file CRT0DAT.ASM, which is provided in
260: the product, and change the line
261:
262: _NFILE_ = 20
263:
264: so that _NFILE_ is set to the new upper limit. For example, for an
265: upper limit of 40 files, change the line to read as follows:
266:
267: _NFILE_ = 40
268:
269: 2. Assemble the newly edited CRT0DAT.ASM.
270:
271: 3. Either explicitly link with this new CRT0DAT.OBJ, or use the new object
272: file to replace the CRT0DAT.OBJ module in the C run-time library for
273: the appropriate memory model.
274:
275: Note that this changes the number of integer file handles that can be used by
276: or returned by functions such as open(), read(), write(), lseek(), and dup().
277: However, the number of "FILE *" standard I/O streams is not affected by
278: this change; this number remains fixed at 20 in all cases.
279:
280: Mouse Driver
281:
282: If you will be using the Microsoft Mouse with the Microsoft CodeView debugger
283: or the Microsoft QuickC Compiler, you must have Version 6.0 or later of the
284: Microsoft Mouse. If you do not, use the version of the MOUSE.COM driver
285: provided in Disk 9 of the package. Copy MOUSE.COM to the appropriate mouse
286: directory. When you are ready to use the mouse, type
287:
288: mouse
289:
290: at the DOS command level. If you want to install the mouse driver automatically
291: every time you reboot, insert the "mouse" command in your AUTOEXEC.BAT file.
292:
293: Note that in earlier releases of Microsoft C, both the MOUSE.SYS and the
294: MOUSE.COM driver were provided. If you have been using an earlier version
295: of the MOUSE.SYS driver, delete the following line from your CONFIG.SYS file:
296:
297: device=\<directory>\mouse.sys
298:
299: where <directory> is the directory where the earlier mouse driver resides.
300:
301:
302: Compiler
303:
304: Function Prototypes
305: -------------------
306: When a call to a function precedes its declaration or definition,
307: the default function prototype that is constructed does not specify
308: the number or type(s) of the arguments.
309:
310: Converting unsigned long to double
311: ----------------------------------
312: Unsigned long items are now converted directly to type double. They are not
313: first converted to type long.
314:
315: The interrupt Attribute
316: ------------------------
317: The interrupt attribute can be applied to a function to tell the compiler that
318: the function is an interrupt handler. This attribute tells the compiler to
319: generate entry and exit sequences that are appropriate for an interrupt-
320: handling function, including saving and restoring all registers and executing
321: an IRET instruction to return.
322:
323: You can access the registers that are saved before the normal entry sequence
324: by declaring the function with a parameter list containing a formal
325: parameter for each register saved. The following example illustrates
326: such a declaration:
327:
328: void interrupt cdecl far int_handler(es,ds,di,si,bp,sp,bx,dx,cx,ax,
329: ip,cs,flags)
330: unsigned es, ds, di, si, bp, sp, bx, dx, cx, ax, ip, cs, flags;
331: {
332: .
333: .
334: .
335: }
336:
337: Note that the formal parameters must appear in the opposite order from
338: the order in which the registers are pushed onto the stack; that is, the
339: parameter representing the first register pushed must appear last in the
340: list, and so on.
341:
342: Observe the following precautions when using interrupt functions:
343:
344: 1. In general, it is not a good idea to call standard-library functions,
345: especially functions that rely on DOS INT 21H system calls, within an
346: interrupt function. (Functions that rely on INT 21H calls include
347: stream- and low-level-I/O functions.) Functions that do not rely
348: on INT 21H, such as string-handling functions, may be safe to use.
349: Before using a standard-library function in an interrupt function,
350: be sure that you are familiar with the library function and what it does.
351:
352: 2. If you change any of the parameters of an interrupt function while the
353: function is executing, the corresponding register will contain the changed
354: value when the function returns. For example,
355:
356: void interrupt cdecl far int_handler(es,ds,di,si,bp,sp,bx,dx,cx,ax,
357: ip,cs,flags)
358: unsigned es, ds, di, si, bp, sp, bx, dx, cx, ax,ip,cs,flags;
359: {
360: .
361: .
362: .
363: ax = -1;
364: .
365: .
366: .
367: }
368:
369: causes the AX register to contain -1 when the int_handler function
370: returns. In general, it is not a good idea to modify the values of
371: the parameters representing the IP, CS, and flags registers in interrupt
372: functions.
373:
374: Limit on Nested Include Files
375: -----------------------------
376: The limit given in Section E.3.4 for nested include files refers to the total
377: number of open files that the compiler allows. Since the original source
378: file counts as an open file, a total of nine files (in addition to the
379: original file) may have #include directives.
380:
381:
382: CL Driver
383:
384: C1L.EXE
385: -------
386: An alternate form of compiler pass 1 named C1L.EXE is provided for compiling
387: programs that get "out of near/far heap space" errors. Invoke C1L.EXE
388: by entering the CL command with the /B1 <path> option as illustrated
389: below:
390:
391: cl /B1 <path>\c1l.exe <sourcefile>.c
392:
393: where <path> is the path (including drive and directory) where C1L.EXE resides
394: and <sourcefile> is the name of the C source file you are compiling.
395:
396: Specifying Overlays
397: -------------------
398: You can now specify overlays on the CL command line. Simply enclose the names
399: of the overlay source or object files in parentheses. For example, if you
400: enter the command line
401:
402: cl src_1.c (src_2.c obj_1) obj_2
403:
404: then the SRC_2.OBJ and OBJ_1.OBJ modules are overlays in the SRC_1.EXE
405: file and are read into memory from disk only if and when they are needed.
406:
407: Expanding Wild-Card Arguments
408: ----------------------------
409: If you are linking your program with the SETARGV.OBJ file to expand
410: wild-card arguments, you must specify the /NOE linker option, which tells
411: the linker not to use the extended dictionary in searching libraries.
412: (See the description of the /NOE option under the heading "Linker Options"
413: later in this document.)
414:
415: The correct form for compiling a program WILDCARD.C that uses wild-card
416: expansion is shown below:
417:
418: CL wildcard.c \lib\setargv /link /NOE
419:
420: or
421:
422: QCL wildcard.c \lib\setargv /link /NOE
423:
424: This procedure is not necessary if you have used LIB to place the wild-card
425: expansion routines in the standard C combined library (mLIBCf.LIB).
426:
427: /Fa Option
428: ----------
429: You must use Version 5.10 of the Microsoft Macro Assembler to assemble
430: output from the /Fa option. Earlier versions of the Macro Assembler do not
431: support the new communal variables generated by the /Fa option.
432:
433: /D Option
434: ---------
435: Note that the /Didentifier= and /Didentifier=string forms of this option
436: cannot be defined in the CL environment variable. This is because the SET
437: command does not accept the equal sign (=), which is a special character
438: in the environment.
439:
440: Predefined Identifiers
441: ----------------------
442: The compiler now defines the following new identifiers:
443:
444: Identifier Function
445: ---------- --------
446: M_I8086 Identifies the target processor as an 8086. Defined by
447: default or when the /G0 option is given explicitly.
448:
449: M_I286 Identifies the target processor as an 80286. Defined
450: when the /G1 or /G2 option is given.
451:
452: You can still give the same number of /D options on the CL command line.
453:
454: Note that the /u option no longer removes the definition of the predefined
455: identifier M_I86mM, which identifies the memory model. You can use the
456: /U option to remove the definition of M_I86mM; however, if you do,
457: the NULL constant will not be defined automatically in the program
458: (since the definition of NULL in the stdio.h and stddef.h files depends
459: on the memory model in use). If you compile a program with the /UM_I86mM
460: option, be sure to define NULL explicitly if you use it in the program.
461:
462: /J Option
463: ---------
464: When the /J option is given on the CL command line, a new predefined
465: identifier, _CHAR_UNSIGNED, is defined. This identifier is used with #ifndef
466: in the limits.h file to define the range of the default char type. Note that
467: compiling with /J reduces by 1 the number of constant and macro definitions
468: that can be given on the command line.
469:
470: /Oi Option/#pragma intrinsic
471: ----------------------------
472: In addition to the functions listed in Section 3.3.13 under "Generating
473: Intrinsic Functions," the following functions have intrinsic forms:
474:
475: Floating-point functions:
476: -------------------------
477: pow, log, log10, exp
478: sin, cos, tan
479: asin, acos, atan, atan2
480: sinh, cosh, tanh
481: sqrt
482: fabs, fmod
483:
484: Other functions:
485: ----------------
486: _enable, _disable
487: inpw, outpw
488:
489: If you use intrinsic forms of the floating-point functions listed above (that
490: is, if you compile with the /Oi option or specify any of the functions in an
491: intrinsic pragma), you cannot link with an alternate-math library
492: (mLIBCA.LIB). Any attempt to do so will cause unresolved-external errors
493: at link time. Note that this restriction applies even if you link with an
494: alternate-math library after compiling with the /FPc or /FPc87 option.
495:
496: If you want to compile with /Oi (to use the intrinsic forms of
497: non-floating-point functions) and then link with an alternate-math library,
498: specify any floating-point functions that appear in a program in a function
499: pragma.
500:
501: /Ox Option
502: ----------
503: For Version 5.10 of Microsoft C, the /Ox option performs more optimizations than
504: in previous versions, including loop optimizations and generation of intrinsics
505: for certain library functions. If you have problems compiling programs with the
506: /Ox (maximum optimization) option, try breaking the option down to its
507: component parts and removing either the "i" (generate intrinsics) or the "l"
508: (perform loop optimizations) from the option string; then try recompiling the
509: program. For Version 5.10, the "expanded" version of the /Ox option is
510:
511: /Oailt /Gs
512:
513: Disabling Unsafe Loop Optimizations: The /On Option
514: ----------------------------------------------------
515: The new /On option disables potentially unsafe loop optimizations in programs
516: compiled with the /Ol or /Ox option. When the /On option is used, the compiler
517: does not perform the following types of loop optimizations:
518:
519: o Hoisting division operations out of loops. This type of optimization can
520: cause problems in code such as the following:
521:
522: for (i=0; i<=99; i+=10)
523: {
524: if (denom != 0)
525: {
526: array[i] += (numer/denom);
527: printf("%f ", array[i]);
528: }
529: }
530:
531: When loop optimizations are turned on, the compiler knows that numer/denom
532: does not change within the loop. Therefore, it calculates numer/denom
533: only once: before the start of the loop and before the if statement
534: within the loop can check for division by zero. Compiling with the /On
535: option helps to avoid "divide by zero" errors that may result from code
536: like that shown above.
537:
538: o Loop-induction optimizations. When loop optimizations are turned on,
539: this code
540:
541: int larray[400];
542: unsigned char k, top_val, inc_val, var;
543:
544: for( k = 3; k < top_val; k += 8 )
545: {
546: larray[k*4] = k*4;
547: }
548:
549: is optimized to code such as the following:
550:
551: unsigned char t;
552: for( t = 12; t < top_val*4; t += 32 )
553: {
554: larray[t] = t;
555: }
556:
557: If the loop-control variable top_val in the original code is 64, the
558: induction expression top_val*4 overflows the limit for type unsigned
559: char, and the loop never terminates. To avoid this problem, the code is
560: optimized as shown below when the /On option is used:
561:
562: unsigned char t;
563: for( t = 12, k=3; k < top_val; k += 8, t += 32 )
564: {
565: larray[t] = t;
566: }
567:
568: The /On option can be used to solve similar overflow problems in cases
569: where induction variables result from array or pointer references and the
570: offset part of the address is close to wrapping.
571:
572: In general, you may want to compile with /On if your programs use arrays that
573: are larger than 32K, or if divide-by-zero or infinite-loop errors occur in
574: programs compiled with the /Ol option.
575:
576: /Za and /Ze Options
577: -------------------
578: Two new Microsoft extensions have been added to the list in Section 3.3.14:
579:
580: (1) Casting data pointers to function pointers, as in the following example:
581:
582: int *ip;
583: int foo();
584:
585: ((int (*)())ip)();
586:
587: (2) Casting function pointers to data pointers, as in the following example:
588:
589: int *ip;
590: int foo();
591:
592: ip = (int *)foo;
593:
594: Casts like these generate error C2068, "illegal cast," in programs compiled
595: with the /Za option. Otherwise, they generate warning C4074, "non standard
596: extension used," at warning level 3 or higher.
597:
598: The ANSI-standard way to cast from data pointers to function pointers, and
599: from function pointers to data pointers, is to
600:
601: (1) Cast to an integral type (int or long depending on pointer size)
602:
603: (2) Cast to the final pointer type
604:
605: For example, in a small-model program, the examples above could be rewritten
606: as follows to conform to the ANSI convention:
607:
608: ip = (int *)(int)foo; /* cast function pointer to data pointer */
609:
610: ((int (*)())(int)ip)(); /* cast data pointer to function pointer */
611:
612: Examples like those above work correctly whether or not the program is compiled
613: with the /Za option.
614:
615: Segment Setup for Memory Models
616: -------------------------------
617: The primary segments of a C program are ordered in memory as shown below,
618: from the highest memory location to the lowest:
619:
620: Segment Contents
621: ------- --------
622: (Heap) Area of unallocated memory that is available for dynamic
623: allocation by the program. Its size varies, depending on the
624: program's other storage requirements.
625:
626: STACK User's stack, used for all local data items
627:
628: _BSS All uninitialized static data items except those that are
629: explicitly declared as far or huge.
630:
631: c_common
632: Uninitialized global data items for small- and medium-model
633: programs. In compact- or large-model programs, this type of
634: data item is placed in a data segment with class FAR\_BSS.
635:
636: CONST Read-only constants, including floating-point constants,
637: string literals, and segment values for data items declared far
638: or huge or forced into their own segments by use of the /Gt
639: option.
640:
641: _DATA Default data segment: initialized global and static data
642: except data explicitly declared far or huge, or data forced
643: into different segments by use of the /Gt option.
644:
645: NULL Special-purpose segment at the beginning of DGROUP that
646: contains the compiler copyright notice. This segment is
647: checked before and after the program executes. If its
648: contents change during program execution, the program has
649: written to this area, usually by an inadvertent assignment
650: through a null pointer. The error message "Null pointer
651: assignment" appears to warn of this error.
652:
653: (Data
654: segments)
655: Initialized static and global data items, placed in their own
656: segments with class name FAR_DATA, allowing the linker to
657: combine these items so that they precede DGROUP. Uninitialized
658: static and global far data items are placed in segments that
659: have class FAR_BSS, allowing the linker to place these items
660: between the _TEXT segment(s) and DGROUP. Uninitialized huge
661: items are placed in segments with class FAR_DATA. In large-
662: and huge-model programs, global uninitialized data are
663: treated as though declared far (unless specifically declared
664: near) and given class FAR_BSS.
665:
666: _TEXT In small and compact model, segment containing code for all
667: modules. In medium, large, and huge models, each module has
668: its own text segment with the name of the module plus the
669: suffix _TEXT.
670:
671: When you look at a map file produced by linking a C program, you may notice
672: other segments in addition to the names listed below. These additional
673: segments have specialized uses for Microsoft languages and should not be used
674: by other programs.
675:
676: alloc_text Pragma
677: -----------------
678: No more than 10 alloc_text pragmas may appear in the same compilation unit.
679:
680: The alloc_text pragma MUST appear after the declarations of any functions
681: given in the pragma. Functions given in an alloc_text pragma may be
682: implicitly near (because the small or compact memory model is used) or
683: explicitly near (declared with the near keyword), provided that they are
684: called only by functions in the same segment.
685:
686: Functions referenced in an alloc_text pragma should be defined in the same
687: module as the pragma. If this is not done, and an undefined function is
688: later compiled into a different text segment, the error may or may not be
689: caught. Although the program will usually run correctly, the function
690: will not be allocated in the intended segments. The following example
691: shows code that may cause these problems:
692:
693: Module 1
694: --------
695: #pragma alloc_text(SEG1, foo, bar)
696:
697: int foo(int i)
698: {
699: i = bar(10);
700: }
701:
702: Module 2
703: --------
704: int bar(int i)
705: {
706: return(i*i);
707: }
708:
709: In the example above, the definitions of the functions foo and bar should
710: appear in the same module to avoid problems.
711:
712:
713: Include Files
714:
715: float.h
716: -------
717: For conformance with the ANSI C standard, the following constants defined in
718: the include file float.h refer to a base-2 exponent in Version 5.10 of
719: Microsoft C:
720:
721: DBL_MIN_EXP
722: DBL_MAX_EXP
723: FLT_MIN_EXP
724: FLT_MAX_EXP
725: LDBL_MIN_EXP
726: LDBL_MAX_EXP
727:
728: In Version 4.0, these constants refer to a base-10 exponent. The base-10
729: versions of these constants are now named DBL_MIN_10_EXP, DBL_MAX_10_EXP,
730: and so on.
731:
732: graph.h
733: -------
734: See the current version of the file for the most recent constant names and
735: definitions related to graphics functions.
736:
737:
738:
739: Graphics-Library Functions
740:
741: Graphics Functions
742: ------------------
743: Several new elements have been added to the graph.h file, including
744: elements in the videoconfig structure and manifest constants that allow you
745: to test the adapter and monitor information in the videoconfig
746: structure.
747:
748: Colors in Graphics and Text Modes
749: ---------------------------------
750: In a color text mode (such as _TEXTC80), _setbkcolor accepts (and
751: _getbkcolor returns) an attribute, or pixel value. The value for the
752: default colors is given by the table in Section 4.4 of the QuickC Programmer's
753: Guide. For example, _setbkcolor(2L) sets the background color to pixel
754: value 2. The actual color displayed depends on the palette mapping for
755: pixel value 2. The default is green in a color text mode.
756:
757: In a color graphics mode (such as _ERESCOLOR), _setbkcolor accepts (and
758: _getbkcolor returns) a color (as used in _remappalette). The value for the
759: background color is given by the manifest constants defined in the graph.h
760: include file. For example, _setbkcolor(_GREEN) sets the background color
761: in a graphics mode to green. These manifest constants are provided as a
762: convenience in defining and manipulating the most common colors. The
763: actual range of colors is, in general, much greater.
764:
765: The function _setcolor accepts an int value as an argument. It is an attribute
766: or pixel value.
767:
768: In general, whenever an argument is long, it refers to a color, and
769: whenever it is short, it refers to an attribute or pixel value. The two
770: exceptions are _setbkcolor and _getbkcolor described above.
771:
772:
773: Other Library Functions
774:
775: The following notes refer to the reference pages in the Microsoft C
776: Run-Time Library Reference.
777:
778: _amblksiz
779: ---------
780: In Chapter 3 of the Library Reference, _amblksiz should be defined with type
781: unsigned int rather than type int.
782:
783: atof, strtod
784: ------------
785: In compact- and large-model programs, the string argument to these functions
786: can be a maximum of 100 characters in length.
787:
788: _bios_keybrd, _bios_printer
789: ---------------------------
790: The return value from the functions _bios_keybrd and _bios_printer
791: should be unsigned int.
792:
793: cputs, fputs, puts
794: ------------------
795: The return value from the cputs, fputs, or puts function is 0 if the
796: function returns normally or a nonzero value if an error occurs.
797:
798: ctime, gmtime, localtime, mktime
799: --------------------------------
800: Calls to the mktime and ctime functions modify the single statically allocated
801: buffer used by gmtime and localtime. Thus, a mktime or ctime call
802: destroys the results of any previous localtime or gmtime call.
803:
804: The parameter to the localtime function should be declared as
805:
806: const time_t *time;
807:
808: The documentation of the TZ environment variable should appear in the
809: description of the gmtime function rather than the localtime function.
810:
811: _dos_findfirst, _dos_findnext
812: -----------------------------
813: If the attributes argument to either of these functions is _A_RDONLY, _A_HIDDEN,
814: _A_SYSTEM, or _A_SUBDIR, the function also returns any "normal" files (that is,
815: any files that are not read-only, hidden, or system files or subdirectories)
816: that match the path argument.
817:
818: _dos_open
819: ---------
820: The argument to the _dos_open function should be *handle. Also, the constant
821: O_RDONLY is defined in the fcntl.h header file, which should be included
822: if O_RDONLY is used as the mode argument.
823:
824: exec*, spawn* functions
825: -----------------------
826: Because of a bug in DOS Versions 2.0 and 2.1, child processes generated by
827: the exec family of routines (or by the equivalent spawn routines with the
828: P_OVERLAY argument) may cause fatal system errors when they exit. If you are
829: running under these versions of DOS, you must upgrade to DOS Version 3.0
830: to use these functions in your programs.
831:
832: fclose
833: ------
834: This function takes one parameter, which is declared as
835:
836: int fclose(stream);
837: FILE *stream;
838:
839: FP_OFF, FP_SEG
840: --------------
841: The argument to these functions should be declared as a void far pointer rather
842: than a char far pointer.
843:
844: In models that use near data pointers (small and medium), the FP_SEG and
845: FP_OFF macros work only if the far-pointer argument is stored in the default
846: data segment. If the far pointer is stored in a far data segment, the macros
847: will not work correctly.
848:
849: fopen
850: -----
851: The parameters should be declared as
852:
853: const char *path;
854: const char *type;
855:
856: _fpreset
857: --------
858: In the example, the second to last line should read
859:
860: longjmp(mark, -1);
861:
862: fwrite
863: ------
864: The first parameter should be declared as
865:
866: const void *buffer;
867:
868: int86x
869: ------
870: Under "Return Values," the second paragraph should refer to the cflag field
871: in the outregs union.
872:
873: malloc, _fmalloc, _nmalloc
874: --------------------------
875: The second paragraph under "Return Value" should read, "To get a pointer to a
876: type other than void, use a type cast on the return value."
877:
878: In the entry for malloc, delete the sentence that reads, "The resulting pointer
879: can be passed to the realloc function to adjust the size at any time."
880:
881: To ensure compatibility a recent change to the ANSI C standard,
882: malloc(0) now returns a non-null pointer. In this regard, malloc works the
883: same as it did under Version 4.0 of Microsoft C.
884:
885: memccpy
886: -------
887: The dest and src arguments should have type void * rather than
888: const void *.
889:
890: memchr
891: ------
892: The c argument should have type int rather than size_t, and the count
893: argument should have type size_t rather than unsigned.
894:
895: memmove
896: -------
897: This function should be added to the list of functions (in Section 2.12) that
898: support the use of huge pointers.
899:
900: This function returns the value of the dest parameter, not the src parameter.
901:
902: open and sopen
903: --------------
904: Certain calls to the open or sopen function may set the global variable errno
905: to EINVAL. For example, a call to sopen with an invalid shflag argument
906: (for example, 6) or a call to open with an invalid oflag argument (for
907: example, O_RDWR|O_WRONLY) return a value of -1 and set errno to EINVAL.
908:
909: outpw
910: -----
911: The return value from this function should have type unsigned rather than
912: type void.
913:
914: printf
915: ------
916: In Table R.3, the "Default" column for the "f" format type should read as
917: follows:
918:
919: Default precision is 6;
920: if precision is 0 or the period (.)
921: appears without a number following
922: it, no decimal point is printed.
923:
924: In the same table (R.3), in the "Default" column for the "g" format type,
925: the statement
926:
927: All significant digits are printed.
928:
929: should read
930:
931: Six significant digits are printed, less
932: any trailing zeros that are truncated.
933:
934: realloc
935: -------
936: First paragraph under "Return Value" should read, "The realloc function
937: returns a void pointer to the reallocated memory block." Third paragraph
938: should read, "To get a pointer to a type other than void, use a type cast
939: on the return value."
940:
941: scanf
942: -----
943: The "D," "O," "X," and "I" type characters, which represented long-integer
944: input fields, are no longer supported.
945:
946: setvbuf
947: -------
948: The setvbuf function can be used for an open stream only if that stream has NOT
949: yet been read from or written to.
950:
951: strlen
952: ------
953: The string parameter should have type const char * rather than char *.
954:
955: tmpnam
956: ------
957: The description of this function under "Summary" should read "Create temporary
958: file in the directory defined by P-tmpdir." Also, the sentence beginning
959: "The tmpnam function uses malloc to allocate space..." actually describes the
960: tempnam function rather than the tmpnam function.
961:
962: ungetc
963: ------
964: In the first paragraph under "Description," the second sentence should
965: read, "The stream must be open for reading."
966:
967:
968: Microsoft CodeView Debugger
969:
970: CVPACK Utility
971: --------------
972: A new utility named CVPACK.EXE is provided with this version of Microsoft C.
973: CVPACK can be used to pack the debug information in an executable file that
974: has been compiled with the /Zi option or linked with the /CO option.
975: Packing information allows CodeView to load larger programs without
976: running out of memory.
977:
978: The CVPACK utility has the following command line:
979:
980: CVPACK [/p] <exefile>
981:
982: If you invoke CVPACK without the /p option, the packed debug information is
983: appended to the executable file, so that the file is larger. CodeView
984: uses only the packed debug information.
985:
986: If you invoke CVPACK with the /p option, unused debug information is discarded,
987: and the packed information is written to the executable file, resulting in
988: a smaller executable file.
989:
990: Running CVPACK without the /p option is slightly faster than with the option.
991:
992: To use packed debugging information, you must use Version 2.10 or later of the
993: CodeView debugger.
994:
995: Compiling BASIC Programs for CodeView Debugger
996: ----------------------------------------------
997: To compile BASIC programs for use with the CodeView debugger, specify the
998: /Zi option rather than the /D option.
999:
1000: Expression Evaluator for BASIC Programs
1001: ---------------------------------------
1002: In the BASIC expression evaluator, "+" is not supported for string
1003: concatenation.
1004:
1005: Microsoft Pascal Programs
1006: -------------------------
1007: Microsoft Pascal programs cannot be debugged with the CodeView debugger for
1008: this release.
1009:
1010: The Pascal example on pg. 61 should read
1011:
1012: PAS1 /Z TEST;
1013:
1014: rather than
1015:
1016: PAS1 /Zi TEST;
1017:
1018: Exit Codes for Utilities
1019:
1020: The exit codes for LINK and the utilities in the Microsoft CodeView
1021: and Utilities Guide should appear as follows:
1022:
1023: LINK
1024: ----
1025: Code Meaning
1026:
1027: 0 No error.
1028:
1029: 2 Program error--something was wrong with the commands
1030: or files input to the linker.
1031:
1032: 4 System error. The linker
1033:
1034: - ran out of space on output files
1035: - was unable to reopen the temporary file
1036: - experienced an internal error
1037: - was interrupted by the user
1038:
1039: LIB, EXEPACK, EXEMOD, MAKE, and SETENV
1040: ---------------------------------------
1041: Code Meaning
1042:
1043: 0 No error.
1044:
1045: 2 Program error--something was wrong with the commands
1046: or files input to the utility.
1047:
1048: 4 System error. The utility ran out of memory, was
1049: interrupted by the user, or experienced an internal
1050: error.
1051:
1052: Microsoft LINK Linker
1053:
1054: Linker Options
1055: --------------
1056: The following new options have been added to the linker:
1057:
1058: /NOE[XTDICTIONARY]
1059: Tells the linker not to use the extended dictionary in
1060: searching libraries. Use this option if you redefine a
1061: standard-library routine (such as _setargv or _nullcheck)
1062: in a program module, or if you get linker error L2044 during
1063: linking (see the section titled "Linker Errors" later in this
1064: file for more information). This option may slow the linking
1065: process on some programs.
1066:
1067: The "extended dictionary" is a block of data telling the
1068: linker about interlibrary dependencies; that is, for each
1069: module in the library, the extended dictionary tells the
1070: linker which other modules in the same library are also
1071: required. Although the linker can process libraries faster
1072: with this information, it has trouble in processing if
1073: you redefine symbols (such as the names of standard-library
1074: routines) that otherwise would have been defined in one of
1075: the modules described in the extended dictionary.
1076:
1077: Overlay Restrictions
1078: --------------------
1079: You cannot use long jumps (using the longjmp library function) or indirect
1080: calls (through a function pointer) to pass control to an overlay. When a
1081: function is called through a pointer, the called function must be in the same
1082: overlay or in the root.
1083:
1084:
1085: MAKE Program-Maintenance Utility
1086:
1087: Backslash (\) As Continuation Character
1088: ---------------------------------------
1089: Note that MAKE considers a backslash immediately followed by a new-line
1090: character to be a continuation character. When it finds this combination
1091: in a description file, MAKE concatenates the line immediately following
1092: the combination with the line where the combination appears.
1093:
1094: If you define a macro that ends in a backslash, make sure that you put a
1095: space after the terminating backslash. For example, if you want to define
1096: macros for the path C:\SRC\BIN and C:\SRC\LIB, you must use the format
1097: illustrated below:
1098:
1099: BINPATH=C:\SRC\BIN\<space><new-line>
1100: LIBPATH=C:\SRC\LIB\<space><new-line>
1101:
1102: To illustrate the problems that can result if you do not put a space before the
1103: new-line character, assume that the macros above appear as shown below
1104: instead:
1105:
1106: BINPATH=C:\SRC\BIN\<new-line>
1107: LIBPATH=C:\SRC\LIB\<new-line>
1108:
1109: Because a new-line character appears immediately after the backslash at the end
1110: of the first macro, MAKE assumes that you are defining the single macro shown
1111: below:
1112:
1113: BINPATH=C:\SRC\BIN\LIBPATH=C:\SRC\LIB\
1114:
1115: New /X Option
1116: -------------
1117: The new /X option has the following syntax:
1118:
1119: /X <filename>
1120:
1121: This option redirects errors output by MAKE, or by any programs that MAKE
1122: runs, to the given file. If the <filename> argument is a dash (-), MAKE
1123: redirects error output to the standard output device.
1124:
1125: You may send both error output and standard output to the same file by
1126: combining the "/X -" form of this option with DOS redirection, as in the
1127: following example:
1128:
1129: MAKE /X - project.mak >make.log
1130:
1131: DO NOT specify the same filename to /X as the file following the redirection
1132: symbol (>).
1133:
1134:
1135: ERROUT Standard-Error Redirection Utility
1136:
1137: The ERROUT utility does not accept batch files. To redirect standard-error
1138: output from a batch file, you must enter a command of the following form:
1139:
1140: ERROUT COMMAND /c <batchcommand>
1141:
1142: If no /f option is given, then ERROUT redirects standard-error output to
1143: the standard-output device.
1144:
1145:
1146: Mixed-Language Programming
1147:
1148: C Naming Conventions
1149: --------------------
1150: C recognizes the first 31 characters of a symbolic name.
1151:
1152: Accessing Parameters on the Stack
1153: ---------------------------------
1154: In Section 6.1.5 of the Mixed Languages Programming Guide, the instruction
1155:
1156: mov bx, [bp+6]
1157:
1158: loads the argument into the BX register rather than the BP register.
1159:
1160: Setting Up Calls to High-Level Languages
1161: ----------------------------------------
1162: Section 6.6 of the Mixed Languages Programming Guide gives instructions
1163: for setting up a call to a high-level language from assembly language. Before
1164: you execute a call to a BASIC, Pascal, or FORTRAN routine, remember to declare
1165: an additional parameter if the return value is noninteger. This additional
1166: parameter must contain the offset address of the return value, for which
1167: you must allocate room within the stack segment (normally DGROUP, the same
1168: as the default data segment).
1169:
1170: BASIC Return Values
1171: -------------------
1172: BASIC functions use the FORTRAN/Pascal conventions, rather than the C
1173: conventions, for receiving return values.
1174:
1175: Passing C Strings to BASIC
1176: --------------------------
1177: In Section 8.4.3 of the Mixed Languages Programming Guide, in the example
1178: illustrating how C passes string arguments to BASIC functions, the sd_len
1179: field should be declared as shown below:
1180:
1181: int sd_len
1182:
1183: BASIC Array Declarations
1184: ------------------------
1185: The sample BASIC array declaration in Table 9.1 should read
1186:
1187: DIM x(c-1, r-1)
1188:
1189: Linking with MASM Files
1190: -----------------------
1191: If you are linking C modules with modules created by the Microsoft Macro
1192: Assembler (MASM), either assemble the MASM modules with the /MX
1193: option to preserve case sensitivity in these modules, or use the LINK
1194: command to link in a separate step and do NOT specify the /NOI linker
1195: option.
1196:
1197: Linking Mixed-Language Programs
1198: -------------------------------
1199: This section explains how to link Microsoft C modules with modules created
1200: by other Microsoft languages. The discussions assume that you are linking
1201: with Version 3.61 of the Microsoft Overlay Linker, LINK. (This is the version
1202: of LINK provided with Version 5.10 of the Microsoft C Optimizing Compiler.)
1203:
1204: 1. C 5.10 / FORTRAN 4.0
1205:
1206: To link object modules created using the Microsoft C Compiler, Version 5.10,
1207: with those created using Microsoft FORTRAN Version 4.00 or 4.01, you must
1208: create a special version of each of the FORTRAN libraries you intend to use.
1209: Create one FORTRAN library to correspond to each C library you are using;
1210: that is, create a FORTRAN library that supports the same memory-model/math-
1211: option combination as the corresponding C library. Be sure that you choose
1212: the "C compatibility" option when you build each
1213: FORTRAN library.
1214:
1215: Next, use the SETUP program provided with Microsoft C, Version 5.10, to
1216: create all the combined C 5.10 libraries that you will need. SETUP creates
1217: a subdirectory named \MIXLANG under the C 5.10 base directory.
1218:
1219: Place the FORTRAN libraries you have created in this directory. Then make the
1220: \MIXLANG directory the current directory and run F4COMPAT, which brings the
1221: FORTRAN libraries up to date and makes them compatible with C 5.10. F4COMPAT
1222: takes two arguments: one specifying the memory model and one specifying the
1223: floating-point-math package that the library supports. For example,
1224:
1225: F4COMPAT L 7
1226:
1227: makes a C 5.10-compatible version of LLIBFOR7.LIB.
1228:
1229: Once the libraries are built, use the following LINK command line to
1230: link the appropriate C library with the FORTRAN library that you
1231: converted in the previous example:
1232:
1233: LINK objs,,,LLIBC7.LIB LLIBFOR7.LIB /NOE;
1234:
1235: The LINK command lines for other memory models and floating-point math packages
1236: are similar. Note that the C library must be given first on the command line.
1237: Specify the \MIXLANG subdirectory either in the LIB environment variable
1238: or on the LINK command line so that the linker can find the FORTRAN
1239: library. Use only large- and medium-model libraries. Huge-model programs
1240: use large-model libraries.
1241:
1242:
1243: 2. C 5.10 / QuickBASIC 4.0
1244:
1245: To create a program whose components are built using Microsoft C 5.10 and
1246: Microsoft QuickBASIC 4.0, you should compile your C source files using the
1247: /AL option (large memory model). The QuickBASIC source files can be compiled
1248: either with or without the /o option of the BC command, depending on whether you
1249: want to use the BCOM40.LIB or BRUN40.LIB run-time library. The LLIBCE.LIB
1250: version of the C library is recommended. The main program must be written
1251: in BASIC, and the BASIC run-time library must be given before the C
1252: library on the LINK command line.
1253:
1254: Two recommended compile-and-link sequences are
1255:
1256: (a) CL /AL /c cmodule.c
1257: BC /o bmain.bas;
1258: LINK bmain cmodule,,,BCOM40.LIB LLIBCE.LIB /NOE;
1259:
1260: (b) CL /AL /c cmodule.c
1261: BC bmain.bas;
1262: LINK bmain cmodule,,,BRUN40.LIB LLIBCE.LIB /NOE;
1263:
1264:
1265: 3. C 5.10 / Pascal 4.0
1266:
1267: To create a program whose components are built using Microsoft C 5.10 and
1268: Microsoft Pascal 4.0, compile your C source files with the /AL option
1269: (large memory model). When you give the run-time libraries on the LINK
1270: command line, use a single math package, and use only
1271: large-model C libraries.
1272:
1273: The three recommended combinations of libraries are
1274:
1275: (a) LINK objs,,,LLIBC7.LIB LIBPAS7.LIB /NOE;
1276:
1277: (b) LINK objs,,,LLIBCE.LIB LIBPASE.LIB /NOE;
1278:
1279: (c) LINK objs,,,LLIBCA.LIB LIBPASA.LIB /NOE;
1280:
1281:
1282: LIBRARY MANAGER (LIB)
1283:
1284: There is a new option for LIB: /NOIGNORECASE (abbreviated as /N).
1285: This option tells LIB to not ignore case when comparing symbols.
1286: names. By default, LIB ignores case. Multiple symbols which are
1287: the same except for case can be put in the same library. For
1288: example: "_Open" and "_open". Normally you could not add both
1289: these symbols to the same library.
1290:
1291: Note that if a library is built with /NOI, the library is
1292: internally "marked" to indicate /NOI. All libraries built
1293: with earlier versions of LIB are not marked.
1294:
1295: If you combine multiple libraries, and any one of them is
1296: marked /NOI, then /NOI is assumed for the output library.
1297:
1298: In addition we just added a new option, /IGNORECASE (abbr. /I) which is
1299: completely analagous to /NOIGNORECASE. /I is the default. The only
1300: reason to use it would be if you had an existing library marked /NOI
1301: which you wanted to combine with other libraries which were not marked,
1302: and have the output library be not marked. If you didn't use
1303: /IGNORECASE, the output would be marked /NOI (see above).
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.