Skip to content

Instantly share code, notes, and snippets.

@pghalliday
Created June 23, 2012 11:20
Show Gist options
  • Select an option

  • Save pghalliday/2977939 to your computer and use it in GitHub Desktop.

Select an option

Save pghalliday/2977939 to your computer and use it in GitHub Desktop.
Macro Pasting Hell
#define CALLONE(FUNCTION, ARGS...) FUNCTION(1 , ##ARGS)
CALLONE(add, CALLONE(addOne));
/* expands to */
add(1, CALLONE(addOne));
#define _CALLONE(FUNCTION, ARGS...) FUNCTION(1 , ##ARGS)
#define CALLONE(FUNCTION, ARGS...) _CALLONE(FUNCTION, ARGS)
CALLONE(add, CALLONE(addOne));
/* expands to */
add(1, addOne(1, ));
#define PASTE(ARG1, ARG2) ARG1 ## ARG2
PASTE(Hello, World)();
/* expands to */
HelloWorld();
#define PASTE(ARG1, ARG2) ARG1 ## ARG2
#define HELLO Hello
PASTE(HELLO, World)();
/* expands to */
HELLOWorld();
#define _PASTE(ARG1, ARG2) ARG1 ## ARG2
#define PASTE(ARG1, ARG2) PASTE(ARG1, ARG2)
#define HELLO Hello
PASTE(HELLO, World)();
/* expands to */
HelloWorld();
#define ISEMPTY(ARGS...) /* Too complicated to put here, see http://gustedt.wordpress.com/2010/06/08/detect-empty-macro-arguments/ */
#define _PASTE(ARG1, ARG2) ARG1 ## ARG2
#define PASTE(ARG1, ARG2) PASTE(ARG1, ARG2)
#define CALLONE0(FUNCTION, ARGS...) FUNCTION(1, ARGS)
#define CALLONE1(FUNCTION, ARGS...) FUNCTION(1)
#define CALLONE(FUNCTION, ARGS...) PASTE(CALLONE,ISEMPTY(ARGS))(FUNCTION, ARGS)
CALLONE(add, CALLONE(addOne));
/* expands to */
add(1, addOne(1));
#define CALLONE(FUNCTION, ARGS...) FUNCTION(1 , ##ARGS)
CALLONE(myFunc);
/* expands to */
myFunc(1);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment