У меня есть библиотека C с функцией
#ifdef __cplusplus
extern "C" {
#endif
void exitWithError(const char* func) {
printf("woopsie in %s", func);
exit(1);
}
#ifdef __cplusplus
}
#endif
exitWithError
, которая вызывается исключительно другим кодом C, внутренним для библиотеки. Библиотека C всегда компилируется в «режиме C», то есть через g++ -x c ...
, в соответствии с C99, поэтому не может содержать никакого кода C ++. (Теперь я понял, что это делает проверку #ifdef __cplusplus
полностью излишней, но хо-хум, здесь неактуальна).
Я пытаюсь переопределить exitWithError
в проекте C ++ 14, который используетэта библиотека C, так что я могу изменить способ обработки ошибок (см. мой связанный вопрос ). Это изменит внутреннее поведение библиотеки C. Я пытаюсь избежать изменений в базовом коде библиотеки C, но это не является строгой необходимостью.
Оказывается, я могу в своем коде вызова C ++ просто переопределить поведение exit
с помощью
extern "C" void exit(int status) {
throw 1;
}
Это прекрасно работает, но имеет функцию C exitWithError
, вызывающую printf
. Я хочу удалить это поведение, поэтому ничего не печатается, когда библиотека C вызывает exitWithError
.
Попытка переопределить exitWithError
с помощью того же трюка ...
extern "C" void exitWithError(const char* func) {
throw 1;
}
вызываетduplicate symbol
ошибка во время компиляции, естественно.
А как же exit
позволил переопределить его? Есть ли способ "undefine" exitWithError
, чтобы вызывающий код C ++ мог его переопределить?
Я подозреваю, что мог бы передать дополнительный флаг компилятора (например, -DSILENCE_FOOL
) при компиляции библиотеки C для использования вмой проект C ++, и измените код библиотеки C на
void exitWithError(const char* func) {
#ifndef SILENCE_FOOL
printf("woopsie in %s", func);
#endif
exit(1);
}
, но я бы предпочел метод без каких-либо изменений кода C.
И, наконец, есть ли более разумный способ(рефакторинг библиотеки C), чтобы позволить пользователям библиотеки C "подключиться" или переопределить поведение exitWithError
? Эта функция вызывается, когда пользователь вводит неверные аргументы (в моем коде C ++ я переопределю его с std::invalid_argument
).