C中 #define 模仿 genericity programming from 《C 和 指针 》
/* * brief: genericity programming * */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #define GENERIC_STACK( STACK_TYPE, SUFFIX, STACK_SIZE ) \ \ static STACK_TYPE stack##SUFFIX[ STACK_SIZE ]; \ static int top_element##SUFFIX = -1; \ \ int \ is_empty##SUFFIX( void ) \ { \ return top_element##SUFFIX == -1; \ } \ \ int \ is_full##SUFFIX( void ) \ { \ return top_element##SUFFIX == STACK_SIZE - 1; \ } \ \ void \ push##SUFFIX( STACK_TYPE value ) \ { \ assert( !is_full##SUFFIX() ); \ top_element##SUFFIX += 1; \ stack##SUFFIX[ top_element##SUFFIX ] = value; \ } \ void \ pop##SUFFIX( void ) \ { \ assert( !is_empty##SUFFIX() ); \ top_element##SUFFIX -= 1; \ } \ STACK_TYPE \ top##SUFFIX( void ) \ { \ assert( !is_empty##SUFFIX() ); \ return stack##SUFFIX[ top_element##SUFFIX ]; \ } GENERIC_STACK( int, _int, 10 ) /* GENERIC_STACK( float, _float, 5 ) */ GENERIC_STACK( int, _int1, 10 ) int main() { push_int( 5 ); push_int( 22 ); push_int( 15 ); push_int1( 4 ); push_int1( 23 ); push_int1( 16 ); /*push_float( 25.3 ); push_float( -40.5 );*/ while ( !is_empty_int() ) { printf( "Popping %d\n", top_int() ); pop_int(); } while ( !is_empty_int1() ) { printf( "Popping %d\n", top_int1() ); pop_int1(); } /* while ( !is_empty_float() ) { printf( "Popping %f\n", top_float() ); pop_float(); }*/ exit(0); }