Давайте посмотрим на лес сначала, прежде чем смотреть на деревья.
Здесь есть много информативных ответов с большими подробностями, я не буду повторять ни одного из них. Ключ к программированию в JavaScript имеет сначала правильную ментальную модель общего исполнения.
Хорошие новости заключается в том, что, если вы хорошо понимаете этот момент, вам никогда не придется беспокоиться о гоночных условиях. Прежде всего вы должны понимать, как вы хотите упорядочить свой код как по существу ответ на разные дискретные события, и как вы хотите объединить их в логическую последовательность. Вы можете использовать обещания или новые асинхронные / ожидающие более высокие уровни в качестве инструментов для этой цели, или вы можете откатывать свои собственные.
Но вы не должны использовать какие-либо тактические инструменты для решения проблемы, пока вам не понравится актуальная проблемная область. Нарисуйте карту этих зависимостей, чтобы знать, что нужно запускать, когда. Попытка ad-hoc подхода ко всем этим обратным вызовам просто не поможет вам.
Но все хорошо работает с другими программами на C, связывающими эту библиотеку.
blockquote>Вы заметили, что компиляция C и C ++ создает разные имена символов на уровне объектных файлов? Он называется ' mangling '. Компонент (C ++) будет показывать неопределенные ссылки в виде сообщенных символов в сообщении об ошибке, что может смутить вас. Если вы проверите свой файл
test.o
с помощьюnm -u
, вы увидите, что ссылочные имена символов не совпадают с именами, указанными в вашей библиотеке.Если вы хотите использовать функции, связанные как внешние, которые были скомпилированы с использованием простого компилятора C, вам понадобятся их объявления функций, заключенные в блок
extern "C" {}
, который подавляет кодирование имени C ++ для всего, что было объявлено или определено внутри, например:extern "C" { #include <dual/xalloc.h> #include <dual/xmalloc.h> }
Еще лучше, вы может обернуть ваши объявления функций в ваши файлы заголовков следующим образом:
#if defined (__cplusplus) extern "C" { #endif /* * Put plain C function declarations here ... */ #if defined (__cplusplus) } #endif