Краткая версия вопроса
Можно ли собирать определенные c символов в C в один список / массив в исполняемый файл статически во время компиляции, не полагаясь на инициализация crt (я часто поддерживаю встроенные цели и ограниченно поддерживаю динамическую c память).
РЕДАКТИРОВАТЬ: я на 100% в порядке, когда это происходит во время соединения, а также в том, что в библиотеке нет символов границы.
РЕДАКТИРОВАТЬ 2: Я также в порядке с указанием компилятора c ответов, если это g cc или clang, но я бы предпочел кросс-платформенный, если это возможно.
Более длинная версия с большим фоном
Это было моей болью некоторое время.
Прямо сейчас у меня есть несколько встроенных самотестирований, которые мне нравится выполнять по порядку.
Я применяю одно и то же соглашение о вызовах ко всем функциям и вручную собираю все тесты в массив статически.
// ThisLibrary_testlist.h
#define DECLARE_TEST(TESTNAME) void TESTNAME##_test(void * test_args)
DECLARE_TEST(test1);
DECLARE_TEST(test2);
DECLARE_TEST(test3);
// ThisLibrary_some_module.c
#include "ThisLibrary_testlist.h"
DECLARE_TEST(test1)
{
// ... do hood stuff here
}
// ThisLibrary_testarray.c
#include "ThisLibrary_testlist.h"
typedef void (*testfunc_t) (void*);
#define LIST_TEST(TESTNAME)
testfunc_t tests[] =
{
&LIST_TEST(test1),
&LIST_TEST(test2)
};
// now it's an array... you know what to do.
Пока это поддерживает меня, но это родня Было бы смешно, если бы мне нужно было обновить код в 3 разных местах, если я хочу обновить тест.
Не говоря уже об абсолютном кошмаре #ifdef, который идет с условно скомпилированными тестами.
Есть ли лучший способ?