HP aC++/HP C A.06.28 Programmer's Guide Integrity servers (769150-001, March 2014)

#define identifier( [identifier-list] ) [replacement-list]
The macro name is identifier. The formal parameters are provided by the identifier-list
enclosed in parentheses. The open parenthesis ( ‘(’ ) must immediately follow the identifier with no
intervening white space. If there is a space between the identifier and the parenthesis, the macro
is defined as if it were the first form and the replacement-list begins with the ( character.
The formal parameters to the macro are separated with commas. They may or may not appear in
the replacement-list. When the macro is invoked, the actual arguments are placed in a
parenthesized list following the macro name. Commas enclosed in additional matching pairs of
parentheses do not separate arguments but are themselves components of arguments.
The actual arguments replace the formal parameters in the token string when the macro is invoked.
Specifying String Literals with the # Operator
If a formal parameter in the macro definition directive’s replacement string is preceded by a #
operator, it is replaced by the corresponding argument from the macro invocation, preceded and
followed by a double-quote character (") to create a string literal. This feature, available only with
the ANSI C preprocessor, may be used to turn macro arguments into strings. This feature is often
used with the fact that HP aC++ concatenates adjacent strings.
Example:
#include <iostream.h>
#define display(arg) cout << #arg << \n //define the macro
int main()
{
display(any string you want to use); //use the macro
}
After HP aC++ expands the macro definition in the preceding program, the following code results:
...
main ()
{
cout << any string you want to use << \n;
}
Concatenating Tokens with the ## Operator
Use the ## operator within macros to create a single token out of two other tokens. Usually, one
of these two tokens is the actual argument for a macro-parameter. Upon expansion of the macro,
each instance of the ## operator is deleted and the tokens preceding and following the ## are
concatenated into a single token.
Example 1
The following illustrates the ## operator:
// define the macro; the ## operator
// concatenates arg1 with arg2
#define concat(arg1,arg2) arg1 ## arg2
int main()
{
int concat(fire,fly);
concat(fire,fly) = 1;
printf("%d \n",concat(fire,fly));
}
Preprocessing this program yields the following:
int main()
{
int firefly;
firefly = 1;
printf("%d \n",firefly );
}
122 Preprocessing Directives