C/C++ Programmer's Guide (G06.27+, H06.03+)
Table Of Contents
- What’s New in This Manual
- About This Guide
- 1 Introduction to HP C and C++ for NonStop Systems
- TNS C Language System
- TNS C++ Language System
- TNS/R Native C and C++ Language System
- TNS/R Native C Compiler
- TNS/R Native C++ Compiler
- TNS/R Native C Run-Time Library
- C++ Run-Time Library and Standard C++ Library
- TNS/R Native Linkers (nld and ld Utilities)
- Inspect Symbolic Debugger
- Visual Inspect Symbolic Debugger
- TNS/R Native Object File Tool (noft Utility)
- NonStop SQL/MP Compiler and NonStop SQL/MX Compiler
- TNS/R Native C and C++ Migration Tool
- Features of TNS/R Native C and C++
- TNS/E Native C and C++ Language System
- TNS/E Native C Compiler
- TNS/E Native C++ Compiler
- TNS/E Native C Run-Time Library
- C++ Run-Time Library and Standard C++ Library
- TNS/E Native Linker (eld Utility)
- Native Inspect Symbolic Debugger
- Visual Inspect Symbolic Debugger
- TNS/E Native Object File Tool (enoft Utility)
- NonStop SQL/MP Compiler and NonStop SQL/MX Compiler
- TNS/E Native C and C++ Migration Tool
- Features of TNS/E Native C and C++
- Writing Portable Programs
- Porting Programs to HP C and C++ for NonStop Systems
- Porting Without Data Alignment Problems
- Guardian and OSS Environment Interoperability
- 2 C and C++ Extensions
- 3 Interfacing to Guardian Procedures and OSS Functions
- 4 Using the C Run-Time Library
- 5 Using the Standard C++ Library
- 6 Accessing Middleware Using HP C and C++ for NonStop Systems
- 7 Mixed-Language Programming for TNS Programs
- 8 Mixed-Language Programming for TNS/R and TNS/E Native Programs
- 9 System-Level Programming
- 10 Converting C-Series TNS Programs to Use the Current TNS Compiler
- 11 Migrating Programs to TNS/R or TNS/E Native Mode
- 12 Preprocessor Directives and Macros
- 13 Compiler Pragmas
- ALLOW_CPLUSPLUS_COMMENTS
- ALLOW_EXTERN_EXPLICIT_INSTANTIATION
- ANSICOMPLY
- ANSISTREAMS
- BUILD_NEUTRAL_LIBRARY
- CALL_SHARED
- CHECK
- COLUMNS
- CPATHEQ
- CPPONLY
- CSADDR
- ELD(arg)
- ENV
- ERRORFILE
- ERRORS
- EXTENSIONS
- EXTERN_DATA
- FIELDALIGN
- FORCE_VTBL
- FORCE_STATIC_TYPEINFO
- FORCE_STATIC_VTBL
- FUNCTION
- HEADERS
- HEAP
- HIGHPIN
- HIGHREQUESTERS
- ICODE
- IEEE_FLOAT
- INLINE
- INLINE_COMPILER_GENERATED_FUNCTIONS
- INLINE_LIMIT
- INLINE_STRING_LITERALS
- INNERLIST
- INSPECT
- KR
- LARGESYM
- LD(arg)
- LINES
- LINKFILE
- LIST
- LMAP
- MAP
- MAPINCLUDE
- MAXALIGN
- MIGRATION_CHECK
- NEST
- NEUTRAL
- NLD(arg)
- NOEXCEPTIONS
- NON_SHARED
- OLDCALLS
- OLIMIT
- ONCE
- OPTFILE
- OPTIMIZE
- OVERFLOW_TRAPS
- PAGE
- POOL_STRING_LITERALS
- POP
- PUSH
- REFALIGNED
- REMARKS
- RUNNABLE
- RUNNAMED
- RVU
- SAVEABEND
- SEARCH
- SECTION
- SHARED
- SQL
- SQLMEM
- SRL
- SRLExportClassMembers
- SRLExports
- SRLName
- SSV
- STDFILES
- STRICT
- SUPPRESS
- SUPPRESS_VTBL
- SYMBOLS
- SYNTAX
- SYSTYPE
- TANDEM_FLOAT
- TRIGRAPH
- VERSION1
- VERSION2
- VERSION3
- WARN
- WIDE
- XMEM
- XVAR
- 14 Compiling, Binding, and Accelerating TNS C Programs
- 15 Compiling, Binding, and Accelerating TNS C++ Programs
- 16 Compiling and Linking TNS/R Native C and C++ Programs
- 17 Compiling and Linking TNS/E Native C and C++ Programs
- 18 Using ETK and Native C/C++ Cross Compiler on the PC
- 19 Running and Debugging C and C++ Programs
- 20 TNS C Compiler Messages
- 21 Native C and C++ Compiler Messages
- 22 Run-Time Messages
- 23 Handling TNS Data Alignment
- A HP C Implementation-Defined Behavior
- Implementation-Defined Behavior of Native C
- G.3.1 Translation
- G.3.2 Environment
- G.3.3 Identifiers
- G.3.4 Characters
- G.3.5 Integers
- G.3.6 Floating Point
- G.3.7 Arrays and Pointers
- G.3.8 Registers
- G.3.9 Structures, Unions, Enumerations, and Bit Fields
- G.3.10 Qualifiers
- G.3.11 Declarators
- G.3.12 Statements
- G.3.13 Preprocessing Directives
- G.3.14 Library Functions
- G.4 Locale Behavior
- G.5 Common Extensions
- Translation Limits for Native C Compilers
- Implementation-Defined Behavior of TNS C
- G.3.1 Translation
- G.3.2 Environment
- G.3.3 Identifiers
- G.3.4 Characters
- G.3.5 Integers
- G.3.6 Floating Point
- G.3.7 Arrays and Pointers
- G.3.8 Registers
- G.3.9 Structures, Unions, Enumerations and Bit Fields
- G.3.10 Qualifiers
- G.3.11 Declarators
- G.3.12 Statements
- G.3.13 Preprocessing Directives
- G.3.14 Library Functions
- G.4 Locale Behavior
- G.5 Common Extensions
- Implementation-Defined Behavior of Native C
- B TNS C++ ImplementationDefined Behavior
- C ASCII Character Set
- D Data Type Correspondence
- E Features and Keywords of Version2NativeC++
- F MIGRATION_CHECK Messages
- Glossary
- Index
Mixed-Language Programming for TNS/R and
TNS/E Native Programs
HP C/C++ Programmer’s Guide for NonStop Systems—429301-010
8-5
Declaring External Routines
•
If the pTAL definition specifies the EXTENSIBLE attribute, the interface declaration
must specify _extensible.
•
If the pTAL definition specifies the VARIABLE attribute, the interface declaration
must specify _variable.
Examples
1. This example, taken from the stdlib.h header file, shows the preferred style for
declaring an external routine (in this case, for the CRE_ASSIGN_MAXORDINAL_
procedure). The declaration consists of a standard function prototype and a
FUNCTION pragma:
void get_max_assign_msg_ordinal (void);
...
#pragma function get_max_assign_msg_ordinal
(alias(“CRE_ASSIGN_MAXORDINAL_”), extensible, tal)
The example above is equivalent to this interface declaration:
_extensible _tal _alias (“CRE_ASSIGN_MAXORDINAL_”)
get_max_assign_msg_ordinal (void);
2. This example, taken from the cextdecs header, shows the interface declaration
for the CHANGELIST system procedure. Notice that identifier names in the
parameter type list are optional, because C cares only about the types of the
parameters:
_tal _variable _cc_status CHANGELIST(short, short, short);
3. This example shows you how to use the _cc_status type specifier while also
using a function prototype and a FUNCTION pragma to declare an external
procedure.
Notice that the variable c_code is declared as type _cc_status so that it can be
compared against the condition code that is contained in the _status_eq()
macro:
#include <tal.h> /* defines _cc_status and _status_eq */
_cc_status C_GETPOOL (short *pool_head,
long block_size,
long* block_addr);
#pragma function C_GETPOOL (tal, alias("C^GETPOOL"))
short *pool_alloc ( short *my_pool, long size )
{
_cc_status c_code;
long blk_addr;
c_code = C_GETPOOL(my_pool, size, &blk_addr);
if (_status_eq(c_code))
return( (short *)blk_addr );