commit 80641fc03f1ac1b5ce8b4beea9e65e5bf2be516b Author: Mathieu Maret Date: Fri Nov 18 15:06:46 2016 +0100 Add array build by preproc diff --git a/C/preproc_array/Makefile b/C/preproc_array/Makefile new file mode 100644 index 0000000..dc98e0a --- /dev/null +++ b/C/preproc_array/Makefile @@ -0,0 +1,20 @@ +CPPFLAGS ?= -Werror -Wall -std=c99 + +program = test +sources = $(wildcard *.c) +objects = $(sources:%.c=%.o) +depends = $(sources:%.c=%.d) + +%.d: %.c + @$(CPP) $(CPPFLAGS) -c -MP -MM -MT "$@ $*.o" $< >$@ + +$(program): $(objects) + $(CXX) -o $@ $^ $(LDFLAGS) $(LDLIBS) + +.PHONY: clean +clean: + rm -f $(program) $(objects) $(depends) + +ifneq ($(MAKECMDGOALS),clean) +-include $(depends) +endif diff --git a/C/preproc_array/a.c b/C/preproc_array/a.c new file mode 100644 index 0000000..2706194 --- /dev/null +++ b/C/preproc_array/a.c @@ -0,0 +1,8 @@ +#include "i.h" +#include + +static void f1(void) { + printf("A\n"); +} + +ADD_FUNC(f1); diff --git a/C/preproc_array/b.c b/C/preproc_array/b.c new file mode 100644 index 0000000..c833b01 --- /dev/null +++ b/C/preproc_array/b.c @@ -0,0 +1,8 @@ +#include "i.h" +#include + +static void f1(void) { + printf("B\n"); +} + +ADD_FUNC(f1); diff --git a/C/preproc_array/i.h b/C/preproc_array/i.h new file mode 100644 index 0000000..4c7bc1d --- /dev/null +++ b/C/preproc_array/i.h @@ -0,0 +1,11 @@ +typedef void (*my_func_cb)(void); + +typedef struct func_ptr_s { + my_func_cb cb; /* function callback */ +} func_ptr_t; + +#define ADD_FUNC(func_cb) \ + static func_ptr_t ptr_##func_cb \ +__attribute((used, section("my_array"))) = { \ + .cb = func_cb, \ +} diff --git a/C/preproc_array/main.c b/C/preproc_array/main.c new file mode 100644 index 0000000..3f4ffdb --- /dev/null +++ b/C/preproc_array/main.c @@ -0,0 +1,31 @@ +#include "i.h" +#include + +static void f3(void) { + printf("MAIN\n"); +} + +ADD_FUNC(f3); + +#define section_foreach_entry(section_name, type_t, elem) \ + for (type_t *elem = \ + ({ \ + extern type_t __start_##section_name; \ + &__start_##section_name; \ + }); \ + elem != \ + ({ \ + extern type_t __stop_##section_name; \ + &__stop_##section_name; \ + }); \ + ++elem) + + +int main(int argc, char *argv[]) +{ + section_foreach_entry(my_array, func_ptr_t, entry) { + entry->cb(); /* this will call f1, f2 and f3 */ + } + + return 0; +}