Alessandro Bonazzi
e075990ed3
Files correlati : Commento : Aggiunto il preprocessore c++ mcpp per sostituire il compilatore nella compilazione delle maschere.
48 lines
1.3 KiB
C
48 lines
1.3 KiB
C
/* u_1_24.c: Undefined behaviors on empty argument of macro call. */
|
|
|
|
/* u.1.24: Empty argument of macro call. */
|
|
/*
|
|
* Note: Since no argument and one empty argument cannot be distinguished
|
|
* syntactically, additional dummy argument may be necessary for an
|
|
* intermediate macro to process one empty argument (if possible).
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#define ARG( a, dummy) # a
|
|
#define EMPTY
|
|
#define SHOWN( n) printf( "%s : %d\n", # n, n)
|
|
#define SHOWS( s) printf( "%s : %s\n", # s, ARG( s, dummy))
|
|
#define add( a, b) (a + b)
|
|
#define sub( a, b) (a - b)
|
|
#define math( op, a, b) op( a, b)
|
|
#define APPEND( a, b) a ## b
|
|
|
|
main( void)
|
|
{
|
|
int x = 1;
|
|
int y = 2;
|
|
|
|
/* printf( "%s : %d\n", "math( sub, , y)", ( - y));
|
|
or other undefined behavior. */
|
|
SHOWN( math( sub, , y));
|
|
|
|
/* printf( "%s : %s\n", "EMPTY", "");
|
|
or other undefined behavior. */
|
|
SHOWS( EMPTY);
|
|
|
|
/* printf( "%s : %s\n", "APPEND( CON, 1)", "CON1"); */
|
|
SHOWS( APPEND( CON, 1));
|
|
|
|
/* printf( "%s : %s\n", "APPEND( CON, )", "CON");
|
|
or other undefined behavior. */
|
|
SHOWS( APPEND( CON, ));
|
|
|
|
/* printf( "%s : %s\n", "APPEND( , )", "");
|
|
or other undefined behavior. */
|
|
SHOWS( APPEND( , ));
|
|
|
|
return 0;
|
|
}
|
|
|