|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* M I S C . T
|
|
Packit |
b40e2e |
* 1998/08 Made public. kmatsui
|
|
Packit |
b40e2e |
* 2003/11 Slightly revised. kmatsui
|
|
Packit |
b40e2e |
* 2004/11 Split samples for "Reiser cpp" as "trad.t".
|
|
Packit |
b40e2e |
* Removed duplicate samples with other testcases.
|
|
Packit |
b40e2e |
* kmatsui
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* Miscellaneous texts for test of preprocessor.
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* PART 1, 2 are excerpts from
|
|
Packit |
b40e2e |
* ISO C 6.8.3 "Examples"
|
|
Packit |
b40e2e |
* Some other examples are excerpted from :
|
|
Packit |
b40e2e |
* P.J.Plauger "The Standard C Library",
|
|
Packit |
b40e2e |
* GCC "cpp.info"
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* PART 1
|
|
Packit |
b40e2e |
* Weird tests of macro rescan.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#define x 3
|
|
Packit |
b40e2e |
#define f(a) f(x * (a))
|
|
Packit |
b40e2e |
#undef x
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#define x 2
|
|
Packit |
b40e2e |
#define g f
|
|
Packit |
b40e2e |
#define z z[0]
|
|
Packit |
b40e2e |
#define h g(~
|
|
Packit |
b40e2e |
#define m(a) a(w)
|
|
Packit |
b40e2e |
#define w 0,1
|
|
Packit |
b40e2e |
#define t(a) a
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
rescan()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
/* f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* should expand to:
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* g(x+(3,4)-w) | h 5) & m
|
|
Packit |
b40e2e |
* (f)^m(m);
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* should result in:
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* f(2 * (2+(3,4)-0,1)) | f(2 * (~ 5)) & f(2 * (0,1))^m(0,1);
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
g(x+(3,4)-w) | h 5) & m
|
|
Packit |
b40e2e |
(f)^m(m);
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* PART 2
|
|
Packit |
b40e2e |
* Tests of creating string literal and concatenation of tokens.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#define str(s) # s
|
|
Packit |
b40e2e |
#define xstr(s) str(s)
|
|
Packit |
b40e2e |
#define debug(s,t) printf("x" # s "= %d, x" # t "= %s", \
|
|
Packit |
b40e2e |
x ## s, x ## t)
|
|
Packit |
b40e2e |
#define INCFILE(n) vers ## n /* comment */
|
|
Packit |
b40e2e |
#define glue(a, b) a ## b
|
|
Packit |
b40e2e |
#define xglue(a, b) glue(a, b)
|
|
Packit |
b40e2e |
#define HIGHLOW "hello"
|
|
Packit |
b40e2e |
#define LOW LOW ", world"
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
stringize()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
/* debug(1, 2);
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* should result in:
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* printf("x" "1" "= %d, x" "2" "= %s", x1, x2);
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* after concatenation of the character string literals:
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* printf("x1= %d, x2= %s", x1, x2);
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
debug(1, 2);
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* fputs(str(strncmp("abc\0d", "abc", '\4')
|
|
Packit |
b40e2e |
* == 0) str(: @\n), s);
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* should result in:
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* fputs("strncmp(\"abc\\0d\", \"abc\", '\\4') == 0" ": @\n", s);
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* after concatenation of the character string literals (exactly, the each
|
|
Packit |
b40e2e |
* escape sequences are converted to a corresponding character prior to the
|
|
Packit |
b40e2e |
* concatenation):
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* fputs("strncmp(\"abc\\0d\", \"abc\", '\\4') == 0: @\n", s);
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
fputs(str(strncmp("abc\0d", "abc", '\4') /* this goes away */
|
|
Packit |
b40e2e |
== 0) str(: @\n), s);
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* glue(HIGH, LOW);
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* should result in:
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* "hello";
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
glue(HIGH, LOW);
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* xglue(HIGH, LOW)
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* should result in:
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* "hello" ", world"
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* after concatenation of the character string literals:
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* "hello, world"
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
xglue(HIGH, LOW)
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#undef f
|
|
Packit |
b40e2e |
#undef g
|
|
Packit |
b40e2e |
#undef h
|
|
Packit |
b40e2e |
#undef m
|
|
Packit |
b40e2e |
#undef t
|
|
Packit |
b40e2e |
#undef w
|
|
Packit |
b40e2e |
#undef x
|
|
Packit |
b40e2e |
#undef z
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* #include xstr(INCFILE(2).h)
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* should expand to (after macro replacement, before file access):
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* #include "vers2.h"
|
|
Packit |
b40e2e |
*
|
|
Packit |
b40e2e |
* "vers2.h" includes <stdio.h> and <limits.h> for the later tests.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#include xstr(INCFILE(2).h)
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* PART 3
|
|
Packit |
b40e2e |
* More tests of token concatenation, taken from
|
|
Packit |
b40e2e |
* Kernighan & Ritchie "The C Programming Language", 2nd. Ed., A12.3.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
concat()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
/* This is expanded to:
|
|
Packit |
b40e2e |
* abc;
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
xglue( xglue( a, b), c);
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* This is also expanded to:
|
|
Packit |
b40e2e |
* abc;
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
xglue( glue( a, b), c);
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* Results of these macro calls are undefined, once expanded to:
|
|
Packit |
b40e2e |
* glue( a, b)c;
|
|
Packit |
b40e2e |
* xglue( a, b)c;
|
|
Packit |
b40e2e |
* ')c' is not a valid preprocessing token.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
glue( glue( a, b), c);
|
|
Packit |
b40e2e |
glue( xglue( a, b), c);
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* PART 4
|
|
Packit |
b40e2e |
* More samples of token concatenation.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#define COMMAND( name) { # name, name ## _command }
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
struct command commands[] = {
|
|
Packit |
b40e2e |
/* { "quit", quit_command }, */
|
|
Packit |
b40e2e |
COMMAND (quit),
|
|
Packit |
b40e2e |
/* { "help", help_command }, */
|
|
Packit |
b40e2e |
COMMAND (help),
|
|
Packit |
b40e2e |
};
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#define maxof( type) maxof ## type
|
|
Packit |
b40e2e |
#define DefMax( type) \
|
|
Packit |
b40e2e |
type maxof( type)( type a, type b) \
|
|
Packit |
b40e2e |
{ \
|
|
Packit |
b40e2e |
return (( a > b) ? a : b); \
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* int maxofint( int a, int b) { return (( a > b) ? a : b); } */
|
|
Packit |
b40e2e |
DefMax( int)
|
|
Packit |
b40e2e |
/* double maxofdouble( double a, double b)
|
|
Packit |
b40e2e |
* { return (( a > b) ? a : b); }
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
DefMax( double)
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* PART 5
|
|
Packit |
b40e2e |
* Test of stringization.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
line()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
/* 211; "211"; "__LINE__"; */
|
|
Packit |
b40e2e |
__LINE__; xstr( __LINE__); str( __LINE__);
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* PART 6
|
|
Packit |
b40e2e |
* Tests of handling escape sequences.
|
|
Packit |
b40e2e |
* Tests of concatenation of string literals.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
escape()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
#undef NDEBUG
|
|
Packit |
b40e2e |
#include <assert.h>
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* In ASCII character set */
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
assert( '\a' == 7);
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* After string concatenation :
|
|
Packit |
b40e2e |
* results somehow as this:
|
|
Packit |
b40e2e |
* ((strcmp( "132", "132") == 0) ? (void) 0 :
|
|
Packit |
b40e2e |
* _assert( "strcmp( \"\\x31\" \"32\", \"132\") == 0",
|
|
Packit |
b40e2e |
* "misc.t",270));
|
|
Packit |
b40e2e |
* ((strcmp( "132", "132") == 0) ? (void) 0 :
|
|
Packit |
b40e2e |
* _assert( "strcmp( \"\\61\" \"32\", \"132\") == 0",
|
|
Packit |
b40e2e |
* "misc.t",271));
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
assert( strcmp( "\x31" "32", "132") == 0);
|
|
Packit |
b40e2e |
assert( strcmp( "\61" "32", "132") == 0);
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* In the messy encoding of KANJI called shift-JIS, "表" is encoded as
|
|
Packit |
b40e2e |
* "\x95\x5C", the latter byte is not a beginning of an escape sequence.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
assert( strcmp( "表" "作成", "表作成") == 0);
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* PART 7
|
|
Packit |
b40e2e |
* Tests of evaluating constant expression in long, unsigned long.
|
|
Packit |
b40e2e |
* Tests of <limits.h>, <assert.h>.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#include <limits.h>
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#if INT_MAX < INT_MIN || UINT_MAX <= INT_MAX
|
|
Packit |
b40e2e |
# error bad int properties
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
#if LONG_MAX < 2147483647 || -2147483647 < LONG_MIN || LONG_MAX < INT_MAX
|
|
Packit |
b40e2e |
# error bad long properties
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#define NDEBUG
|
|
Packit |
b40e2e |
#include <assert.h>
|
|
Packit |
b40e2e |
assert_long()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
/* This macro is ineffective now that NDEBUG is defined. */
|
|
Packit |
b40e2e |
assert( LONG_MAX >= 2147483647
|
|
Packit |
b40e2e |
&& -2147483647 >= LONG_MIN
|
|
Packit |
b40e2e |
&& LONG_MAX >= INT_MAX);
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
ulong()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
/* For the compiler which has unsigned long data type */
|
|
Packit |
b40e2e |
#if defined ULONG_MAX && (ULONG_MAX < 4294967295 \
|
|
Packit |
b40e2e |
|| ULONG_MAX / 2 < LONG_MAX || ULONG_MAX < UINT_MAX)
|
|
Packit |
b40e2e |
# error bad unsigned long properties
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
internal()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
/* The following 2 samlpes overflow on two's complement representation. */
|
|
Packit |
b40e2e |
#if -LONG_MIN == LONG_MAX
|
|
Packit |
b40e2e |
This is not a "two's complement" representation.
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
#if LONG_MIN * -1 == LONG_MAX
|
|
Packit |
b40e2e |
This is not a "two's complement" representation.
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* On two's complement representation this expression evaluate to false. */
|
|
Packit |
b40e2e |
#if defined (ULONG_MAX) && ULONG_MAX / 2 > LONG_MIN
|
|
Packit |
b40e2e |
This is not "two's complement" representation or mis-implementation.
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* Right bit-shift of negative number is implementation-defined. */
|
|
Packit |
b40e2e |
#if -2 >> 1 == -1
|
|
Packit |
b40e2e |
Arithmetic right shift of negative number.
|
|
Packit |
b40e2e |
#elif -2 >> 1 == LONG_MAX
|
|
Packit |
b40e2e |
Logical shift of negative number of "two's complement" representation.
|
|
Packit |
b40e2e |
#else
|
|
Packit |
b40e2e |
Maybe logical shift of other than "two's complement" representation.
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* Dividing or modulo containing negative operand is not portable. */
|
|
Packit |
b40e2e |
#if -7 / 3 != -2
|
|
Packit |
b40e2e |
Not algebraic dividing of negative number.
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
#if -7 % 3 != -1
|
|
Packit |
b40e2e |
What ?
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* PART 8
|
|
Packit |
b40e2e |
* Extended or obsolete facilities.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
non_standard()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
#if defined __cplusplus || __STDC_VERSION__ == 199901L
|
|
Packit |
b40e2e |
// Comment in C++ style, terminating with '\x95\x5C' encoded in shift-JIS 表
|
|
Packit |
b40e2e |
"__cplusplus" is defined or "__STDC_VERSION__" equals 199901L.
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/* sizeof in #if expression is disallowed in Standard C */
|
|
Packit |
b40e2e |
#if sizeof (long) < sizeof (int)
|
|
Packit |
b40e2e |
# error bad long properties
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
#if sizeof (char *) == 2 && sizeof (int (*)()) == 2
|
|
Packit |
b40e2e |
puts( "This is a small memory model.");
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#if __MCPP > 1
|
|
Packit |
b40e2e |
/* Trace the process of macro expansion */
|
|
Packit |
b40e2e |
#ifdef __STDC__
|
|
Packit |
b40e2e |
#pragma MCPP debug memory /* list heap memory */
|
|
Packit |
b40e2e |
#pragma MCPP debug token /* trace token */
|
|
Packit |
b40e2e |
#else
|
|
Packit |
b40e2e |
#debug memory
|
|
Packit |
b40e2e |
#debug token
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
/* glue ( a, b)c; */
|
|
Packit |
b40e2e |
glue( glue( a, b), c);
|
|
Packit |
b40e2e |
#ifdef __STDC__
|
|
Packit |
b40e2e |
#pragma MCPP end_debug token /* no debug */
|
|
Packit |
b40e2e |
#else
|
|
Packit |
b40e2e |
#end_debug token
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
#endif /* __MCPP */
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
#define TRUE 1
|
|
Packit |
b40e2e |
#define FALSE 0
|
|
Packit |
b40e2e |
#ifndef __STDC__
|
|
Packit |
b40e2e |
#ifdef __MCPP
|
|
Packit |
b40e2e |
#assert TRUE != 0 && FALSE == 0
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
put_long()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
char * line = "line";
|
|
Packit |
b40e2e |
#ifndef __STDC__
|
|
Packit |
b40e2e |
#ifdef __MWC09__
|
|
Packit |
b40e2e |
/* Assemly source for Microware-C/09 */
|
|
Packit |
b40e2e |
/* fputs( line, stdout); */
|
|
Packit |
b40e2e |
#asm
|
|
Packit |
b40e2e |
leax _iob+13,y /* stdout */
|
|
Packit |
b40e2e |
pshs x
|
|
Packit |
b40e2e |
ldd 2,s /* line */
|
|
Packit |
b40e2e |
pshs d
|
|
Packit |
b40e2e |
lbsr fputs
|
|
Packit |
b40e2e |
leas 4,s
|
|
Packit |
b40e2e |
#endasm
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
#endif
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
/*
|
|
Packit |
b40e2e |
* PART 9
|
|
Packit |
b40e2e |
* Ambiguous macros and others.
|
|
Packit |
b40e2e |
*/
|
|
Packit |
b40e2e |
wide_and_nonwide()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
/* Wide-character string literal following string literal and vice versa. */
|
|
Packit |
b40e2e |
"string" L"漢字";
|
|
Packit |
b40e2e |
L"漢字" "string";
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|
|
Packit |
b40e2e |
ambiguous()
|
|
Packit |
b40e2e |
{
|
|
Packit |
b40e2e |
/* Result of "f(2)(9)" is left intentionally ambiguous by Standard (ANSI C
|
|
Packit |
b40e2e |
"Rationale", 3.8.3.4). */
|
|
Packit |
b40e2e |
/* 2*f(9); or 2*9*g; */
|
|
Packit |
b40e2e |
#define f(a) a*g
|
|
Packit |
b40e2e |
#define g(a) f(a)
|
|
Packit |
b40e2e |
f(2)(9);
|
|
Packit |
b40e2e |
}
|
|
Packit |
b40e2e |
|