Сбор тестовых символов в массив статически в C / C ++ - PullRequest
1 голос
/ 16 марта 2020

Краткая версия вопроса

Можно ли собирать определенные 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, который идет с условно скомпилированными тестами.

Есть ли лучший способ?

...