diff options
| -rw-r--r-- | Makefile | 9 | ||||
| -rw-r--r-- | c-templates.c | 34 | 
2 files changed, 41 insertions, 2 deletions
| @@ -3,7 +3,7 @@ CC := gcc  CFLAGS := -Wall -Wextra -Wpedantic  BIND := bin -CSRCS = $(shell find . -type f -name '*.c') +CSRCS = $(shell find * -type f -name '*.c')  .PHONY: all clean @@ -12,6 +12,11 @@ all: $(CSRCS:%.c=$(BIND)/%)  clean:  	rm -rf $(BIND) +$(BIND)/c-templates: c-templates.c +	mkdir -p $(dir $@) +	gcc -E -CC $^ | gcc -E -CC -DDEFINE=\#define -xc - | gcc $(CFLAGS) --std=gnu99 -o $@ -xc - +  $(BIND)/%: %.c -	mkdir -p $(dir $@)p +	@echo $@ +	mkdir -p $(dir $@)  	$(CC) $(CFLAGS) $^ -o $@ diff --git a/c-templates.c b/c-templates.c new file mode 100644 index 0000000..d9f9846 --- /dev/null +++ b/c-templates.c @@ -0,0 +1,34 @@ +#include <stdio.h> + +// Build using: +//   gcc -E -CC c-templates.c | gcc -E -CC -DDEFINE=\#define -xc - | gcc --std=gnu99 -xc - + +#define TEMPLATE_VA_ARGS __VA_ARGS__ +#define template(name, ...) /* +*/ DEFINE name(types, ...) __TEMPLATE_##name types f(TEMPLATE_VA_ARGS); }) /* +*/ DEFINE __TEMPLATE_##name(__VA_ARGS__) ({ + +// template syntax: +//   declare: template(name, ... types) return_t f(... args) { ... body } +//   call:    name((... types), ... args) + +template(print_hex, T) void f(T c)       /* +*/{                                      /* +*/    printf("%x\n", c);                 /* +*/} + +template(max, T) T f(T a, T b)           /* +*/{                                      /* +*/    return (a > b) ? a : b;            /* +*/} + +int main(void) +{ +    print_hex((int), 16); +    print_hex((int), '\n'); + +    printf("%d\n", max((int), 5, 10)); +    printf("%f\n", max((float), 362.38098f, 7.4323f)); +    printf("%ld\n", max((long), 409343432, 430483249)); +    return 0; +} | 
