www.digitalmars.com Home | Search | CTG | RTL | IDDE | STL
Last update Sun Apr 9 00:02:29 2006
Compiler & Tools Guide

Compiling
Compiling Code
C Implementation
C++ Implementation
Language Extensions
Mixing Languages
Assembly Language
Inline Assembler
Optimizing Code
Numerics Programming
Regular Expressions
Acrtused
Pragmas
Precompiled Headers
Predefined Macros
Warning Messages
Error Messages
Runtime Messages


Linking
Optlink
Switches
Module Definition Files
Operation and Design
Error Messages


Win32 Programming
Win32 Programming


DOS and Win16
Programming

Memory Models
16 Bit Pointer Types
and Type Modifiers

Handle Pointers
DOS
DOS 32 (DOSX)
Win16
Win16 DLLs
Win16 Prolog/Epilog


C/C++ Extensions
Contract Programming
__debug statement
__debug declaration
Dynamic Profiling
Embedding C in HTML


Tools
BCC
CHMOD
CL
COFF2OMF
COFFIMPLIB
DMC
DIFF
DIFFDIR
DUMP
DUMPOBJ
DUMPEXE
EXE2BIN
FLPYIMG
GREP
HC
IMPLIB
LIB
LIBUNRES
MAKE
MAKEDEP
ME
OBJ2ASM
PATCHOBJ
RC
RCC
SC
SHELL
SMAKE
TOUCH
UNMANGLE
WHEREIS


Porting to DMC++
Switching to DMC++
from Microsoft
from Borland
Porting Guide


Switching to Digital Mars C++

Digital Mars C++ offers numerous advantages over other compilers, both in programmer productivity and in the speed and robustness of generated code. Switching to Digital Mars C++ is well worth the effort. This chapter outlines general considerations for converting existing code.

What's in This Chapter


Portable Programming Practices

Some of the programming practices that help make code portable and reusable also help make it compatible with Digital Mars C++. Your code will be easier to convert if you:
  • Use ANSI standard library functions wherever possible and avoid compiler-specific extensions.
  • Do not rely on the location, alignment, or size of objects in memory. In addition to the inevitable implementation dependencies of memory models, the Digital Mars C++ compiler assigns different widths to some of the standard data types.
  • Do not rely on objects of the same size being treated as if they had the same type. Digital Mars C++ enforces stricter type checking than either Microsoft C++ or Borland C++, and will generate warnings or errors in these instances. In addition, loosely typed code will often fail under 32-bit compilation. For example, Digital Mars C++ defines the WORD type as an unsigned short, and the UINT type as an unsigned int. If these types are treated identically in your code, you can use the -Jm compiler option to relax type checking.
  • Use manifest constants wherever possible, instead of relying on explicit (and possibly compiler or environment dependent) values.
  • Write function prototypes for all your user-defined functions. See the Chapter 3, "Digital Mars C++ Language Implementation" for more information.
  • Can avoid linking files compiled with different compilers. Before you begin conversion, delete all .obj and .lib files created with your old compiler for which you have the source code. Also, be sure that the INCLUDE and LIB environment variables reference the Digital Mars C++ directories so you do not accidentally compile with one vendor's headers and link with the other's libraries.

Object Level Compatibility

Digital Mars C++ object modules are "broadly compatible" with Microsoft and Borland objects. However, there are some differences:
  • The Digital Mars C++ compiler's "helper" functions (long multiply, float, and so on) are different than their Borland or Microsoft counterparts. If you do not want to recode calls to these functions, remove the other vendor's helper functions from their libraries and include them in your converted code.
  • Digital Mars' floating point libraries are reentrant; our object code is therefore different than Microsoft's or Borland's for functions with C linkage. You can work around this problem by rewriting affected functions to pass a pointer to their return value as a parameter, or by using C++, FORTRAN, or Pascal linkage instead of C linkage.
  • The layout of the struct_iob in stdio. h is different for Digital Mars C++. Therefore, you cannot link buffered I/ O functions compiled with Digital Mars' stdio. h with buffered I/ O functions compiled with a different stdio. h. To avoid problems, compile all modules in a program with the same version of stdio. h.
  • By default, Digital Mars C++ aligns structure members on 16-bit boundaries in 16-bit compilations; Microsoft and Borland C++ do not. For binary compatibility, compile with the -a option to suppress structure member alignment.

Using Third-Party Libraries

If you must use third-party libraries written for Microsoft or Borland C++ with the Digital Mars C++ compiler, there is no simple way to determine which features are compatible. Your code could even link correctly and still contain obscure errors.

If you have the source to the third-party library, try recompiling it with Digital Mars C++. A better solution is to obtain the Digital Mars version of the library from the vendor. Recompiling for Digital Mars C++ In many cases, converting programs written for another compiler to Digital Mars C++ can be as easy as recompiling them. Here are some steps you can take to ease recompilation:

  • Compile without the global optimizer until your program runs without errors. A working program can occasionally fail when optimized. For more information, see Chapter 25, "Optimizing Code."
  • In Digital Mars C++, character data is signed by default. If your code depends on char data being unsigned, compile with either the -J or -Ju options. -J treats chars as unsigned, not sign extended. -Ju treats chars as unsigned, sign extended.
  • If your code does not follow strict ANSI type checking rules, use the -Jm option, which relaxes type checking.

Compile time warnings

By default, the Digital Mars C++ compiler generates warnings in response to more conditions than do most other compilers. If you find these unfamiliar warnings annoying, compile with the -w (warning level) option. Each instance of -w on the SC command line turns off a specific warning. For example, the command:
	sc -w2 -w6 myfile.cpp 
turns off warnings number 2 and 6. For information on warnings and their numbers, see Chapter 2, "Compiling Code."

Converting from Microsoft

This chapter describes differences you should consider when converting code written for Microsoft Visual C++ Version 1.5 to Digital Mars C++.

What's in This Chapter

This chapter discusses compatibility issues between Microsoft Visual C++ and Digital Mars C++ with respect to these issues:
  • Keywords
  • Predefined macros
  • Header files
  • Libraries
  • MFC
  • Memory model support
  • Assembly language interface
  • Compiler options

Keywords

Digital Mars C++ supports most of Microsoft C's nonstandard keywords. The following table lists Microsoft's keyword extensions and their Digital Mars counterparts:
	Table 23-1 Support for Microsoft keywords 
	Unsupported Microsoft keywords 
	__fastcall 
	__fortran 
	__saveregs 
	__segment 
	__segname 
	__self 

Predefined Macros

Digital Mars C++ supports most of Microsoft C's nonstandard macros. The following table lists Microsoft's extended macros and their Digital Mars counterparts:
	Table 23-2 Support for Microsoft C nonstandard macros 

	Unsupported Microsoft macros	Digital Mars counterparts 
	_CHAR_UNSIGNED			_CHAR_UNSIGNED 
	_FAST				No support 
	_MSC_VER			__DMC__ (works the same, but 
					version numbers are for SC) 
	_MSDOS 
	MSDOS 				Recommended use is as a 
					command line argument 
	_PCODE				No support 
	_QC				No support 
	M_I286				M_I286 
	M_I386				M_I386 
	M_I8086				M_I8086 
	M_I86				M_I86 
	M_I86CM				M_I86CM 
	M_I86HM				No support 
	M_I86LM				M_I86LM 
	M_I86MM				M_I86MM 
	M_I86SM				M_I86SM 
	M_I86TM				M_I86TM 

Header Files

The Digital Mars C++ run-time library includes all the Microsoft nonstandard headers. Many of these headers simply reference the Digital Mars header file that contains equivalent functions. Digital Mars C++ issues a warning whenever your code makes use of such a header file. In general, we recommend switching to ANSI-compliant headers wherever possible.

Library Functions

Digital Mars C++ supports the great majority of Microsoft Visual C++ Version 1.5 library functions. The table below lists the only Microsoft functions that the Digital Mars C++ run-time library does not support:
	Table 23-3 Unsupported Microsoft library functions 

	Unsupported 	Microsoft 	Comments
	functions	header 

	Graphics functions graph.h	Digital Mars C++ does not 
					support the DOS graphics 
					system. 

	Charting functions pgchart.h
	 
	Virtual memory	vmemory.h	Digital Mars C++ no longer 
	functions			supports Virtual Code 
					Management (VCM). 


	QuickWin functions io.h 

	_bexpand	malloc.h	Use farrealloc instead. 
	_bfree		malloc.h 
	_bfreeseg	malloc.h 
	_bheapadd	malloc.h	Not needed with Digital Mars 
					C++ heap management. 
	_bheapchk	malloc.h 
	_bheapmin	malloc.h 
	_bheapseg	malloc.h 
	_bheapset	malloc.h 
	_bheapwalk	malloc.h 
	_bmalloc	malloc.h 
	_bmsize		malloc.h 
	_brealloc	malloc.h 
	_dieeetomsbin	math.h 
	_dmsbintoieee	math.h 
	_expand		malloc.h	Use realloc instead. 
	_fexpand	malloc.h	Use farrealloc instead. 
	_fheapchk	malloc.h 
	_fheapmin	malloc.h 
	_fheapset	malloc.h 
	_fheapwalk	malloc.h 
	_fieeetomsbin	math.h 
	_fmsbintoieee	math.h 
	_heapadd	malloc.h	Not needed with Digital Mars 
					C++ heap management. 
	_heapchk	malloc.h 
	_heapmin	malloc.h 
	_heapset	malloc.h 
	_heapwalk	malloc.h 
	_j0, _j1, _jnl	math.h 
	_j0l, _j1l, _jn	math.h 
	_nexpand	malloc.h	Use realloc instead. 
	_nheapadd	malloc.h	Not needed with Digital Mars 
					C++ heap management. 
	_nheapchk	malloc.h 
	_nheapmin	malloc.h 
	_nheapset	malloc.h 
	_nheapwalk	malloc.h 
	_setbnew_handler new.h 
	_sethnew_handler new.h 
	_y0, _y1, _ynl	math.h 
	_y0l, _y1l, _yn	math.h 

Microsoft Foundation Classes

Digital Mars C++ for Windows and DOS includes the Microsoft Foundation Classes Version 2.5, for the Large memory model only. Digital Mars C++ for Win32 includes 32-bit MFC 3.0.

Digital Mars' versions of the Microsoft Foundation Class Library are licenced from Microsoft Corporation.

When compiling code that uses the Microsoft Foundation Classes, use the -gf option (see Chapter 2, "Compiling Code").

Memory Models

The Digital Mars C++ implementation of those 16-bit memory models also supported by Microsoft C (the Small, Medium, Compact, and Large) is similar, but not exactly the same. The significant differences are:
  • In the Digital Mars Compact and Large models, unlike their Microsoft counterparts, the stack segment and data segment are not the same. Near pointers in these models are relative to the data segment and cannot be used to access automatic or parameter variables. Check your assembly language source code to ensure that SS is not assumed to be equal to DS.
  • Microsoft C only creates a far data segment if the amount of data exceeds 32,767 bytes, or exceeds the value specified via the /Gt option to CL (Digital Mars C++ has a corresponding compiler option, -GT). While data is always assigned to the near data segment by default, functions are near by default in the Compact model and far by default in the Large model in Digital Mars C++.
  • Digital Mars' malloc() functions take an unsigned int as an argument for all 16-bit memory models and take an unsigned long for 32-bit models. Therefore, the 16-bit models limit the size of a data object to 64KB blocks. To allocate a block greater than 64KB, call farmalloc, which takes an unsigned long.
  • At program startup, a Microsoft C program's heap management run-time allocates _amblksiz bytes of far heap space. Additional heap is allocated in _amblksiz blocks as needed. In contrast, Digital Mars C++ makes a call to DOS for each request for far heap space.
  • Unlike Microsoft C, Digital Mars C++ does not allocate heap blocks of zero size if a program requests them. NULL is returned instead.
  • Unlike Microsoft C, Digital Mars C++ cleans up free heap space when a program releases a block of memory.
  • Digital Mars C++ does not support the Microsoft C _heapadd, _bheapadd, and _nheapadd functions because its heap manager calls DOS each time a program requests far heap space.
  • Digital Mars C++ does not support the Microsoft _expand, _bexpand, _fexpand, and _nexpand routines. Use realloc in place of _expand or _nexpand calls (or wherever possible), and farrealloc in place of _bexpand or _fexpand. However, be aware that realloc and farrealloc, unlike _expand, can move the block to a new location to satisfy the reallocation request, in which case they will return the new location of the reallocated block.
  • Digital Mars C++ does not support these additional non-standard Microsoft memory management functions: _heapchk, _bheapchk, _fheapchk, _nheapchk, _heapwalk, _bheapwalk, _fheapwalk, _nheapwalk, _heapset, _bheapset, _fheapset, _nheapset, _heapmin, _bheapmin, _fheapmin, _nheapmin.

Huge memory model support

Digital Mars C++ does not support the Huge memory model. That is, a pointer whose type is unspecified cannot be made huge by default. However, the compiler supports huge pointers and huge data (via the __huge modifier).

Digital Mars C++ also supports the Microsoft halloc and hfree functions.

Support for based pointers

Digital Mars C++ does not support a based heap. No support for based pointers is available except for:
	__based(__segname("_CODE"));
	__based(__segname("_DATA")); 
	__based(__segname("_STACK")); 
If your code makes use of based pointers, convert them to far pointers. Based pointers are a nonstandard construct and the code generated using them is not significantly better than for far pointers.

Assembly Language Interface

The Digital Mars C++ assembly language interface is very similar to Microsoft's. The only differences are:
  • DS is not equal to SS for the Compact and Large memory models.
  • For C functions (those declared as __cdecl or extern "C"), double and float values are returned in the registers, rather than in a static memory locaton. For C++, FORTRAN, and Pascal functions, double and float values are returned on the stack in a manner compatible with Microsoft C.
  • In Digital Mars C++, structs, floats, and doubles are returned by allocating a temporary variable on the stack and passing a hidden pointer to it. The called function copies the return values into this variable and returns a pointer to it.

Compiler Options

Digital Mars C++ provides a wide range of compiler command line options, many of which perform operations similar or identical to a Microsoft compiler option.

To convert your old Microsoft compiler command lines to the most similar Digital Mars command lines possible, use the CL utility. CL automatically converts Microsoft command lines to SC command lines, and then runs SC.


Converting from Borland

This chapter describes the differences you should consider when converting code written for Borland C++ Version 4.0 to Digital Mars C++.
  • Keywords
  • Predefined macros
  • Header files
  • Libraries
  • Memory model support
  • Assembly language interface
  • Compiler options

Keywords

Digital Mars C++ supports many of Borland C's nonstandard keywords. The following table lists Borland's extended keywords and their Digital Mars counterparts:
	Table 24-1 Support for Borland nonstandard keywords 
	Unsupported Borland keywords Digital Mars counterparts 
	_cs __cs 
	_ds No equivalent 
	_es No equivalent 
	_saveregs No equivalent 
	_seg No equivalent 
	_ss __ss 

Predefined Macros

Digital Mars C++ supports many of Borland C's nonstandard macros. The following table lists Borland's extended macros and their Digital Mars counterparts:
	Table 24-2 Support for Borland C++ nonstandard macros 

	Unsupported Borland macros Digital Mars counterparts 

	__BORLANDC__	__DMC__ (works the same, but 
				version numbers are for SC) 
	__BCPLUSPLUS__	__DMC__	(works the same, but 
				version numbers are for SC) 
	__CDECL__	No equivalent 
	__COMPACT__	__COMPACT__ 
	__DLL__		_WINDLL 
	__HUGE__	No equivalent 
	__LARGE__	__LARGE__ 
	__MEDIUM__	__MEDIUM__ 
	__MSDOS__	No equivalent 
	__PASCAL__	No equivalent 
	__OVERLAY__	No equivalent 
	__SMALL__	__SMALL__ 
	__TEMPLATES__	No equivalent 
	__TINY__	__TINY__ 
	__TCPLUSPLUS__	__DMC__ (works the same, but 
				version numbers are for SC) 
	__TURBOC__	__DMC__ (works the same, but 
				version numbers are for SC) 
	_Windows	_WINDOWS 

Header Files

The Digital Mars C++ run-time library includes all the Borland non-standard headers. Many of these headers simply reference the Digital Mars header file that contains equivalent functions. Digital Mars C++ issues a warning whenever code uses a header file. In general, we recommend switching to ANSI-compliant headers wherever possible.

Library Functions

Digital Mars C++ supports most Borland library functions. The table below lists those Borland functions that the Digital Mars C++ run-time library does not support:
	Table 24-3 Unsupported Borland library functions 
	Unsupported 	Borland header	Comments
	functions 

	Graphics functions	graphics.h 
	Text display functions	conio.h 
	_dos_getvect		dos.h 
	_dos_setvect		dos.h 
	_harderr		dos.h 
	_hardresume		dos.h 
	_hardreturn		dos.h 
	_OvrInitEms		dos.h 
	_OvrInitExt		dos.h 
	_setcursortype		conio.h Use display package functions 
	cgets			conio.h Use display package functions 
	cprintf			conio.h Use display package functions 
	cputs			conio.h Use display package functions 
	closedir		dirent.h 
	cscanf			conio.h 
	dostounix		dos.h
	farheapcheck		alloc.h
	farheapcheckfree	alloc.h
	farheapchecknode	alloc.h
	farheapfillfree		alloc.h
	farheapwalk		alloc.h
	getpass			conio.h
	getvect			dos.h
	harderr			dos.h
	hardresume		dos.h
	hardreturn		dos.h
	heapcheck		alloc.h
	heapcheckfree		alloc.h
	heapchecknode		alloc.h
	heapfillfree		alloc.h
	heapwalk		alloc.h
	import			dos.h
	importb			dos.h
	intr			dos.h
	opendir			dirent.h
	outport			dos.h
	outportb		dos.h
	readdir			dirent.h
	rewinddir		dirent.h
	setvect			dos.h
	unixtodos		dos.h
Some Digital Mars C++ run-time library functions have different types or numbers of arguments from their Borland counterparts, return different values, or support different defined constants. For information on specific functions see the Run-Time Library Reference.

Borland Graphics Interface

Digital Mars C++ does not support any of the functions, fonts, or drivers in the Borland Graphics Interface.

Memory Models

The Digital Mars C++ implementations of those 16-bit memory models also supported by Borland C++ (the Tiny, Small, Medium, Compact, and Large models) are similar. Their significant differences include:
  • In the Digital Mars Compact and Large models, unlike their Borland counterparts, the stack and data segments are not the same. Near pointers in these models are relative to the data segment and cannot access automatic or parameter variables. Check your assembly language source code to ensure that SS is not assumed to be equal to DS.
  • Digital Mars' malloc() functions take an unsigned int as an argument for 16-bit memory models and take an unsigned long for 32-bit models. Therefore, the 16-bit models limit the size of a data object to 64KB blocks. To allocate a block greater than 64KB, call farmalloc, which takes an unsigned long.
  • At program startup, Borland's memory-management routine allocates all available DOS memory as one block of far heap space. In contrast, Digital Mars C++ makes a call to DOS for each request for far heap space.
  • Digital Mars C++ does not support these additional non-standard Borland memory-management functions: heapcheck, farheapcheck, heapfillfree, farheapfillfree, heapwalk, farheapwalk, coreleft.

Huge memory model support

Digital Mars C++ does not support the Huge memory model. That is, a pointer whose type is unspecified cannot be made huge by default. However, the compiler supports huge pointers and huge data (via the huge modifier).

Digital Mars C++ does not support the Borland halloc and hfree functions. Convert calls to these functions to the corresponding Digital Mars far calls (which have unsigned long argument types and can, therefore, allocate huge blocks) or store the affected data in a different structure (a huge array, for example).

Assembly Language Interface

The Digital Mars C++ assembly language interface is very similar to Borland's. The only differences are:
  • DS is not equal to SS for the Compact and Large memory models.
  • For C functions (those declared as __cdecl and extern "C"), double and float values are returned in registers, rather than in a static memory location. For C++, FORTRAN, and Pascal functions, double and float values are returned on the stack in a manner compatible with Borland C.
  • In Digital Mars C++, structs, floats, and doubles are returned by allocating a temporary variable on the stack and passing a hidden pointer to it. The called function copies the return values into this variable and returns a pointer to it.
  • Digital Mars C++ does not support the _FLAGS register variable.
  • Digital Mars C++ does not store long double values as 10-byte quantities; they are the same as doubles (8 bytes).

Compiler Options

Digital Mars C++ provides a wide range of compiler command line options, many of which perform operations similar or identical to a Borland C++ compiler option.

To convert Borland compiler command lines to the most similar Digital Mars command lines possible, use the BCC utility. BCC automatically converts Borland C++ command lines to SC command lines and then runs SC.