Я работаю над библиотекой в C. У меня есть функция, которая должна быть доступна пользователю библиотеки. Он должен быть скомпилирован и выполнен, когда определенное значение определено как 1, но он не должен компилироваться вообще, когда это значение определено как 0 (использование должно быть заменено на (void)0
, которое будет оптимизировано).
Я понял, что могу использовать для этого макрос, как здесь:
#include <stdio.h>
#include <stdarg.h>
#define ENABLE_PRINT_NUMBERS 0
#if ENABLE_PRINT_NUMBERS
void print_numbers(int number, ...);
#endif
#if !ENABLE_PRINT_NUMBERS
#define print_numbers(number, ...) (void)0
#endif
#if ENABLE_PRINT_NUMBERS
void print_numbers(int number, ...) {
va_list va;
va_start(va, number);
const int second_number = va_arg(va, int);
va_end(va);
printf("numbers: %d, %d\n", number, second_number);
}
#endif
int main() {
printf("## Shadowing by macro - test ##\n\n");
print_numbers(1, 2);
printf("function address: 0x%x\n", (void*)&print_numbers);
return 0;
}
Однако, когда такая функция не компилируется (#define ENABLE_PRINT_NUMBERS 1
), &print_numbers
не объявляется. Есть ли способ написать макрос, в котором будут объявляться и использование, и адрес функции? Написание второго определения только с именем функции приводит к ошибке print_numbers previously defined here
.
Я хочу избежать использования «специальных пустых функций», потому что в этой библиотеке есть еще 15 функций, которые необходимо исключить в выпуске. Эта библиотека предназначена для встраиваемых устройств, и я хочу иметь как можно меньший объем памяти.
Для ясности:
Я не хочу получать адрес функционального макроса. Я хочу, чтобы адрес этой функции имел НЕКОТОРЫЕ значение (желательно ноль), потому что адрес этой функции используется во многих местах библиотеки, и я стараюсь как можно меньше изменять библиотеку. В местах, где используется такой адрес, проверяется, является ли указатель нулевым, поэтому это не вызовет неопределенного поведения.