Вариационный аргумент с использованием макросов в C

#c #c 11 #variadic-functions

#c #c 11 #вариативные функции

Вопрос:

У меня есть 2 платформы, для которых требуются разные библиотечные функции, но я хочу свести к минимуму код, необходимый для их поддержки.

Код C 14 :

 #ifdef PLATFORM2
#define FUNCTION_AUTO unsigned int dmd
#else
#define FUNCTION_AUTO void
#endif

//-- WITHIN THE LIBRARY -- //
double getQuality(FUNCTION_AUTO){
  //Computing
  // return value;
}

//-- MAIN EXECUTABLE -- //
int main() {
  std::cout << "Hello World!n";
#ifdef PLATFORM2
  getQuality(100);
#else
  getQuality();
  #endif
}
  

Есть ли лучший способ определить getQuality(..) , чтобы быть общим для 2 платформ без использования манипуляций с препроцессором?

Ответ №1:

Обычным подходом здесь было бы абстрагировать биты, специфичные для платформы, в библиотеку и иметь согласованную абстракцию поверх них.

platform.h

 double Quality();
  

platform_a.cc

 #inclue "platform.h"

double Quality() {
  return getQuality();
}
  

platform_b.cc

 #include "platform.h"

double Quality() {
  return getQuality(100);
}
  

main.c

 #include <iostream>
#include "platform.h"

int main() {
  std::cout << Quality();
}
  

Комментарии:

1. Я попробовал это в первый раз. Приведенный выше пример является одной из многочисленных функций библиотеки, и написание абстракции верхнего уровня для каждой из них на данный момент не является допустимым вариантом