C/C++ Programmer's Guide (G06.25+)

Preprocessor Directives and Macros
HP C/C++ Programmer’s Guide for NonStop Servers429301-002
12-12
Predefined Symbols
void foo (void) {
printf ("Entering function %s\n", __FUNCTION__);
printf ("ch[] was in function \"%s\"\n", ch);
};
int main (void) {
foo ();
}
The output from the preceding code is:
Entering function foo
ch[] was in function ""
Predefined Symbols
The compiler provides three predefined preprocessor symbols: __TANDEM, __INT32,
and __XMEM.
You can use the __TANDEM symbol to increase the portability of your programs.
Enclose system-dependent source text in an if section that uses #ifdef or #ifndef
to test for the existence of the __TANDEM symbol.
The predefined preprocessor symbol __INT32 is defined by the TNS C compiler and
CFront when the WIDE pragma is present. The predefined preprocessor symbol
__XMEM is defined by the TNS C compiler and Cfront when the XMEM pragma is
present. The native compilers always define the preprocessor symbols __INT32 and
__XMEM.
The __INT32 and __XMEM preprocessor symbols affect the visibility of declarations in
header files.
Variadic Macros
Two variants of variadic macro definitions can be invoked in native C with a variable
number of arguments. To use these extensions, you must compile with extensions
enabled.
One variant of variadic macro is the C9X form, described in section 6.8.3 of the
Working Draft, 1997-11-21, WG14/N794 J11/97-158 of the Proposed ISO C
Standard.
For example:
#define D(fmt, ...) printf(fmt, __VA_ARGS__)
/* The "..." matches an arbitrary positive number of macro
arguments that can be referred to by __VA_ARGS__
(includes the separating commas) */
D("%c%s\n" , ’E’, "DG");
/* Expands to "printf("%c%s\n", ’E’, "DG");" */