Придумал новый способ создания header-only библиотек в С и С++
Мне никогда не нравился способ Шона Барретта, поэтому сегодня придумал вот такой, всё отличие в том, что в моём коде ничего не нужно делать, но если понадобится раздельная компиляция заголовочных файлов нужно будет на уровне команд компилятора добавлять везде файл no_ho.h
Пример:
Файл some_header_1.c
#pragma once
#include <stdio.h>
#include <stddef.h>
#ifndef HO_API_NON_STATIC
#ifndef HO_API
#define HO_API static
#endif
#endif
HO_API int hello();
HO_API int world();
#ifndef HO_API_NON_STATIC
#ifndef SOME_HEADER_1_IMPLEMENTATION
#define SOME_HEADER_1_IMPLEMENTATION
#endif
#endif
#ifdef SOME_HEADER_1_IMPLEMENTATION
HO_API int hello() {
// ...
}
HO_API int world() {
// ...
}
#endif // SOME_HEADER_1_IMPLEMENTATION
Файл no_ho.h:
#pragma once
#define HO_API_NON_STATIC
#define HO_API
Команды для header-only компиляции:
gcc -c ... myfile1.c
gcc -c ... myfile2.c
gcc ... main.c myfile1.o myfile2.o
Команды для раздельной компиляции:
gcc -include no_ho.h -DSOME_HEADER_1_IMPLEMENTATION -c ... some_header_1.c
gcc -include no_ho.h -DSOME_HEADER_2_IMPLEMENTATION -c ... some_header_2.c
gcc -include no_ho.h -c ... myfile1.c
gcc -include no_ho.h -c ... myfile2.c
gcc -include no_ho.h ... main.c myfile1.o myfile2.o some_header_1.o some_header_2.o