Add array build by preproc

This commit is contained in:
Mathieu Maret 2016-11-18 15:06:46 +01:00
commit 80641fc03f
5 changed files with 78 additions and 0 deletions

20
C/preproc_array/Makefile Normal file
View File

@ -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

8
C/preproc_array/a.c Normal file
View File

@ -0,0 +1,8 @@
#include "i.h"
#include <stdio.h>
static void f1(void) {
printf("A\n");
}
ADD_FUNC(f1);

8
C/preproc_array/b.c Normal file
View File

@ -0,0 +1,8 @@
#include "i.h"
#include <stdio.h>
static void f1(void) {
printf("B\n");
}
ADD_FUNC(f1);

11
C/preproc_array/i.h Normal file
View File

@ -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, \
}

31
C/preproc_array/main.c Normal file
View File

@ -0,0 +1,31 @@
#include "i.h"
#include <stdio.h>
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;
}