У меня есть библиотека, в которой я хотел бы опубликовать один из двух почти идентичных заголовков общедоступного API, в зависимости от флага сборки, однако этот флаг сборки должен быть совершенно неизвестен пользователю библиотеки. У меня есть флаг CMake, который используется для определения флага сборки, который, конечно, я мог бы просто использовать для включения одного из этих двух заголовков. Однако заголовки идентичны, за исключением точного определения одной функции, и поддерживать их как два отдельных заголовка — плохая идея. Замена CMake блоком кода вместо чего-то вроде @API_VERSION_1@ и @API_VERSION_2@ также кажется ненужной когнитивной перегрузкой, требующей последующего открытия другого файла, содержащего их определения. Мне бы хотелось один большой заголовок, примерно такой:
Код: Выделить всё
// api.h.in
#pragma once
#ifdef BUILD_VERSION_1
void api(int x);
#endif
#ifdef BUILD_VERSION_2
void api(float x);
#endif
void otherFunction();
который затем генерируется CMake в:
Код: Выделить всё
// api.h - where CMake has set BUILD_VERSION_1 ON and BUILD_VERSION_2 OFF
#pragma once
void api(int x);
void otherFunction();
или
Код: Выделить всё
// api.h - where CMake has set BUILD_VERSION_1 ON and BUILD_VERSION_2 ON
#pragma once
void api(int x);
void api(float x);
void otherFunction();
Таким образом, специалист по сопровождению кода может просматривать весь API в одном месте без необходимости переключаться между различными файлами, тогда как пользователь видит только те части API, которые ему доступны, не зная о флаге сборки.
Возможно ли это каким-то четко определенным способом, имеющим прецедент? Я изо всех сил пытаюсь найти ответы, хотя есть все шансы, что мои поисковые запросы неудовлетворительны!
Подробнее здесь:
https://stackoverflow.com/questions/798 ... -substitut