United States    
COMPAQ STORE | PRODUCTS |
SERVICES | SUPPORT | CONTACT US | SEARCH
Compaq C

Compaq C
Run-Time Library Reference Manual for OpenVMS Systems


Previous Contents Index

1.3.3 Linking Examples for Compaq C or Compaq C++ Code Only

The following examples show the different ways you might want to link Compaq C only or Compaq C++ only programs with the Compaq C RTL on OpenVMS VAX systems:

  1. Most of the time, you just want to link against the shareable image:


    $ CC/DECC/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES PROG1
    $ LINK PROG1
    

    The linker automatically searches IMAGELIB.OLB to find DECC$SHR.EXE.

  2. If you want to use just object libraries (to write privileged code or for ease of distribution, for example), use the /NOSYSSHR qualifier of the LINK command:


    $ CC/DECC/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES PROG1
    $ LINK/NOSYSSHR PROG1, SYS$LIBRARY:DECCRTL.OLB/LIBRARY/INCL=CMA$TIS
    

    Prefixed Compaq C RTL symbol references in the user program are resolved in STARLET.OLB.

  3. When compiling with prefixing disabled, in order to use object libraries that provide alternate implementations of C RTL functions, you need to use the DECC*.OLB object libraries. In this case, compile and link as follows:


    $ CC/DECC/NOPREFIX_LIBRARY_ENTRIES PROG1
    $ LINK PROG1, MYLIB/LIBRARY, - 
    _$ SYS$LIBRARY:DECCRTL.OLB/LIBRARY
    

    Unprefixed Compaq C RTL symbol references in the user program are resolved in MYLIB and DECCRTL.OLB. The unprefixed names refrence prefixed names resolved in DECC$SHR.EXE.
    You can link with any valid combination of DECCRTL.OLB, DECCRTLG.OLB, and DECCCURSE.OLB. In this same example, to get G-floating double-precision, floating-point support, you might use the following compile and LINK commands:


    $ CC/DECC/NOPREFIX_LIBRARY_ENTRIES/FLOAT=G_FLOAT PROG1
    $ LINK PROG1, MYLIB/LIBRARY, SYS$LIBRARY:DECCRTLG.OLB/LIBRARY, -
    _$ SYS$LIBRARY:DECCRTL.OLB/LIBRARY
    

  4. Combining examples 2 and 3, you might want to use just the object libraries (for writing privileged code or for ease of distribution) and use an object library that provides C RTL functions. In this case, compile and link as follows:


    $ CC/DECC/NOPREFIX_LIBRARY_ENTRIES PROG1
    $ LINK/NOSYSSHR PROG1, MYLIB/LIBRARY, - 
    _$ SYS$LIBRARY:DECCRTL.OLB/LIBRARY
    

1.3.4 Linking Examples for VAX C and Compaq C Code Combined

You might have programs that combine VAX C and Compaq C (or Compaq C++) code. The following examples show different ways to link such programs with the Compaq C RTL on OpenVMS VAX systems. These examples correspond to the examples in Section 1.3.3.

  1. To link against the shareable image, specify the VAXC2DECC.EXE shareable image:


    $ CC/DECC PROG1
    $ CC/VAXC PROG2
    $ LINK PROG1, PROG2, TT:/OPTIONS
    SYS$LIBRARY:VAXC2DECC.EXE/SHARE
    [Ctrl/Z]
    

    Prefixed C RTL calls from PROG1 are resolved in DECC$SHR. Unprefixed C RTL calls from PROG2 are resolved in VAXC2DECC.EXE, which transfers them to DECC$SHR.

  2. If you want to use just object libraries (to write privileged code or for ease of distribution, for example), use the /NOSYSSHR qualifier of the LINK command:


    $ CC/DECC PROG1
    $ CC/VAXC PROG2
    $ LINK/NOSYSSHR PROG1, PROG2, SYS$LIBRARY:DECCRTL.OLB/LIBRARY/INCL=CMA$TIS
    

    All C RTL calls from both PROG1 and PROG2 are resolved in DECCRTL.OLB.

  3. When compiling with prefixing disabled, in order to use object libraries that provide alternate implementations of C RTL functions, you need to use the DECC*.OLB object libraries. In this case, compile and link as follows:


    $ CC/DECC/NOPREFIX_LIBRARY_ENTRIES PROG1
    $ CC/VAXC PROG2
    $ LINK PROG1, PROG2, MYLIB/LIBRARY, -
    _$SYS$LIBRARY:DECCRTL.OLB/LIBRARY/INCL=CMA$TIS
    

    Unprefixed Compaq C RTL symbol references in the user program are resolved in MYLIB and DECCRTL.OLB.

  4. Combining examples 2 and 3, you might want to use just the object libraries (for writing privileged code or for ease of distribution) and use an object library that provides C RTL functions. In this case, compile and link as follows:


    $ CC/DECC/NOPREFIX_LIBRARY_ENTRIES PROG1
    $ CC/VAXC PROG2
    $ LINK/NOSYSSHR PROG1, PROG2, MYLIB/LIBRARY, -
    _$ SYS$LIBRARY:DECCRTL.OLB/LIBRARY /INCL=CMA$TIS
    

1.3.5 Linking with the VAX C RTL /NOSYSSHR

This section applies to programs running on OpenVMS VAX Version 6.0 or higher.

For programs that currently link with the VAX C RTL object libraries using the /NOSYSSHR qualifier, you must specify /INCLUDE=CMA$TIS for the object library. Otherwise, several symbols will be undefined and the resulting image will not execute. In order to add this qualifier, you cannot use the LNK$LIBRARY logicals to link with the VAX C RTL object libraries. You must use a linker options file or list the VAX C RTL object libraries on the command line. For example:


$ LINK/NOSYSSHR PROG1, SYS$LIBRARY:VAXCRTL.OLB/LIBRARY/INCLUDE=CMA$TIS

1.4 Compaq C RTL Function Prototypes and Syntax

After learning how to link object modules and include header files, you must learn how to reference Compaq C functions in your program. The remaining chapters in this manual provide detailed descriptions of the Compaq C RTL functions.

1.4.1 Function Prototypes

In all chapters, the syntax describing each function follows the standard convention for defining a function. This syntax is called a function prototype (or just prototype). The prototype is a compact representation of the order of a function's arguments (if any), the types of the arguments, and the type of the value returned by a function. The use of prototypes is recommended.

If the return value of the function cannot be easily represented by a C data-type keyword, look for a description of the return values in the explanatory text. The prototype descriptions provide insight into the functionality of the function. These descriptions may not describe how to call the function in your source code.

For example, consider the prototype for the feof function:

#include <stdio.h>
int feof(FILE *file_ptr);

This syntax shows the following information:

To use feof in a program, include <stdio.h> anywhere before the function call to feof , as in the following example:


#include <stdio.h>                 /* Include Standard I/O     */ 
 
main() 
{ 
 
    FILE *infile;                  /* Define a file pointer    */ 
       . 
       . 
       .                           /* Call the function feof   */ 
    while ( ! feof(infile) )       /* Until EOF reached        */ 
       {                           /* Perform file operations  */ 
          . 
          . 
          . 
       } 
} 

1.4.2 Syntax Conventions for Function Prototypes

Since some library functions take a varying number of parameters, syntax descriptions for function prototypes adhere to the following conventions:

Consider the printf syntax description:

#include <stdio.h>
int printf(const char *format_specification, ...);

The syntax description for printf shows that you can specify one or more optional parameters. The remaining information about printf parameters is in the description of the function.

1.4.3 UNIX Style File Specifications

The Compaq C RTL functions and macros often manipulate files. One of the major portability problems is the different file specifications used on various systems. Since many C applications are ported to and from UNIX systems, it is convenient for all compilers to be able to read and understand UNIX system file specifications.

The following file specification conversion functions are included in the Compaq C RTL to assist in porting C programs from UNIX systems to OpenVMS systems:

Note

These DECC$ routine names replace the SHELL$ routine names previously available with the VAX C RTL.

For more information about the DEC/Shell, see the Guide to VAX DEC/Shell.

The advantage of including these file specification conversion functions in the Compaq C RTL is that you do not have to rewrite C programs containing UNIX system file specifications. Compaq C can translate most valid UNIX system file specifications to OpenVMS file specifications.

Note

The Compaq C RTL cannot translate UNIX file specifications with more than one period character (.).

If the UNIX file specification contains a period, all slash characters (/) must precede that period.

Please note the differences between the UNIX system and OpenVMS file specifications, as well as the method used by the RTL to access files. For example, the RTL accepts a valid OpenVMS specification and most valid UNIX file specifications, but the RTL cannot accept a combination of both. Table 1-2 shows the differences between UNIX system and OpenVMS system file specification delimiters.

Table 1-2 UNIX and OpenVMS File Specification Delimiters
Description OpenVMS System UNIX System
Node delimiter :: !/
Device delimiter : /
Directory path delimiter [ ] /
Subdirectory delimiter [ . ] /
File extension delimiter . .
File version delimiter ; Not applicable

For example, Table 1-3 shows the formats of two valid specifications and one invalid specification.

Table 1-3 Valid and Invalid UNIX and OpenVMS File Specifications
System File Specification Valid/Invalid
OpenVMS BEATLE::DBA0:[MCCARTNEY]SONGS.LIS Valid
UNIX beatle!/usr1/mccartney/songs.lis Valid
     
--- BEATLE::DBA0:[MCCARTNEY.C]/songs.lis Invalid

When Compaq C translates file specifications, it looks for both OpenVMS and UNIX system file specifications. Consequently, there may be differences between how Compaq C translates UNIX system file specifications and how UNIX systems translate the same UNIX file specification.

For example, if the two methods of file specification are combined, as in Table 1-3, Compaq C RTL can interpret [MCCARTNEY.C]/songs.lis as either [MCCARTNEY]songs.lis or [C]songs.lis. Therefore, when Compaq C encounters a mixed file specification, an error occurs.

UNIX systems use the same delimiter for the device name, the directory names, and the file name. Due to the ambiguity of UNIX file specifications, Compaq C may not translate a valid UNIX system file specification according to your expectations.

For instance, the OpenVMS system equivalent of /bin/today can be either [BIN]TODAY or [BIN.TODAY]. Compaq C can make the correct interpretation only from the files present. If a file specification conforms to UNIX system file name syntax for a single file or directory, it is converted to the equivalent OpenVMS file name if one of the following conditions is true:

In the UNIX system environment, you reference files with a numeric file descriptor. Some file descriptors reference Standard I/O devices; some descriptors reference actual files. If the file descriptor belongs to an unopened file, the Compaq C RTL opens the file. Compaq C equates file descriptors with the following OpenVMS logical names:
File Descriptor OpenVMS Logical Meaning
0 SYS$INPUT Standard input
1 SYS$OUTPUT Standard output
2 SYS$ERROR Standard error

1.5 Feature-Test Macros for Header-File Control

Feature-test macros provide a means for writing portable programs. They ensure that the Compaq C RTL symbolic names used by a program do not clash with the symbolic names supplied by the implementation.

The Compaq C Run-time Library header files are coded to support the use of a number of feature-test macros. When an application defines a feature-test macro, the Compaq C RTL header files supply the symbols and prototypes defined by that feature-test macro and nothing else. If a program does not define such a macro, the Compaq C RTL header files define symbols without restriction.

The feature-test macros supported by the Compaq C Run-time Library fall into three broad categories for controlling the visibility of symbols in header files according to the following:

1.5.1 Standards Macros

The Compaq C Run-time Library implements parts of the following standards:

1.5.2 Selecting a Standard

You can define a feature-test macro to select each standard. You can do this either with a #define preprocessor directive in your C source before the inclusion of any header file, or with the /DEFINE qualifier on the CC command line.

Table 1-4 lists and describes the Compaq C RTL feature-test macros that control standards support.

macro)
Table 1-4 Feature Test Macros - Standards
Macro Name Standard Selected Other Standards Implied Description
_xopen_source_extended XPG4 V2 XPG4, ISO POSIX-2, ISO POSIX-1, ANSI C Makes visible XPG4-extended features, including traditional UNIX-based interfaces not previously adopted by X/Open.
_xopen_source XPG4 ISO POSIX-2, ISO POSIX-1, ANSI C Makes visible XPG4 standard symbols and causes _posix_c_source to be set to 2 if it is not already defined with a value greater than 2. 1, 2
_posix_c_source ==199506 IEEE 1003.1c-1995 ISO POSIX-2, ISO POSIX-1, ANSI C Header files defined by ANSI C make visible those symbols required by IEEE 1003.1c-1995.
_posix_c_source == 2 ISO POSIX-2 ISO POSIX-1, ANSI C Header files defined by ANSI C make visible those symbols required by ISO POSIX-2 plus those required by ISO POSIX-1.
_posix_c_source == 1 ISO POSIX-1 ANSI C Header files defined by ANSI C make visible those symbols required by ISO POSIX-1.
__stdc_version__ ==199409 ISO C amdt 1 ANSI C Makes ISO C amendment 1 symbols visible.
_ansi_c_source ANSI C --- Makes ANSI C standard symbols visible.


1Where the ISO C Amendment 1 includes symbols not specified by XPG4, defining __stdc_version__ == 199409 and _xopen_source (or _xopen_source_extended) selects both ISO C and XPG4 APIs. Conflicts that arise when compiling with both XPG4 and ISO C Amendment 1 resolve in favor of ISO C Amendment 1.
2Where XPG4 extends the ISO C Amendment 1, defining _xopen_source or _xopen_source_extended selects ISO C APIs as well as the XPG4 extensions available in the header file. This mode of compilation makes XPG4 extensions visible.

Features not defined by one of the previously named standards are considered Compaq C extensions and are selected by not defining any standards-related, feature-test macros.

If you do not explicitly define feature test macros to control header file definitions, you implicitly include all defined symbols as well as Compaq C extensions.


Previous Next Contents Index
  

1.800.AT.COMPAQ

privacy and legal statement