Предположим, есть библиотека, одна из которых определяет функцию с именем foo
, а другая версия имеет имя, измененное на foo_other
, но обе эти функции все еще имеют те же аргументы и возвращаемые значения. Я в настоящее время использую условную компиляцию, как это:Есть ли способ проверить, была ли функция объявлена?
#include <foo.h>
#ifdef USE_NEW_FOO
#define trueFoo foo_other
#else
#define trueFoo foo
#endif
Но это требует какого-то внешнего обнаружения версии библиотеки и установив соответствующий параметр компилятора, как -DUSE_NEW_FOO
. Я бы предпочел, чтобы код автоматически определял, какую функцию он должен вызывать, исходя из того, что он объявлен или нет в <foo.h>
.
Есть ли способ достичь этого в любой версии C?
Если нет, переключится ли на любую версию C++ какие-либо способы сделать это? (при условии, что библиотека выполняет все необходимые действия, например, extern "C"
блоков в своих заголовках)? А именно, я думаю о том, чтобы каким-то образом использовать SFINAE, но для глобальной функции, а не метода, которая обсуждалась в связанном вопросе.
с gcc ... может быть что-то вроде 'prototype ... foo ... __attribute__ ((alias (" foo_other ")));' ... см. Https://gcc.gnu.org/onlinedocs/gcc /Common-Function-Attributes.html – pmg
Это дубликат http://stackoverflow.com/questions/1749233/check-whether-function-is-declared-with-c-preprocessor –
@BrianSidebotham нет, это не так. Я не указал, что нужно использовать препроцессор. Также я прошу об альтернативных способах перехода на C++. – Ruslan