Без extern & ldquo; C & rdquo ;, неопределенная ссылка в деструкторе, но ok в функции члена-не-destructor [duplicate]

Давайте посмотрим на лес сначала, прежде чем смотреть на деревья.

Здесь есть много информативных ответов с большими подробностями, я не буду повторять ни одного из них. Ключ к программированию в JavaScript имеет сначала правильную ментальную модель общего исполнения.

  1. Ваша точка входа (ов) выполняется в результате события. Например, в браузер загружается тег сценария с кодом. (Соответственно, поэтому вам, возможно, придется заботиться о готовности страницы запускать ваш код, если он требует, чтобы элементы dom были сконструированы первыми и т. Д.)
  2. Ваш код выполняется до завершения, однако многие асинхронные вызовы, которые он делает, без выполнения каких-либо ваших обратных вызовов, включая запросы XHR, установку тайм-аутов, обработчиков событий dom и т. д. Каждый из этих обратных вызовов, ожидающих выполнения, будет находиться в очереди, ожидая, что их очередь будет запущена после других событий
  3. Каждый отдельный обратный вызов XHR-запроса, установленного таймаута или dom события после вызова будет завершен.

Хорошие новости заключается в том, что, если вы хорошо понимаете этот момент, вам никогда не придется беспокоиться о гоночных условиях. Прежде всего вы должны понимать, как вы хотите упорядочить свой код как по существу ответ на разные дискретные события, и как вы хотите объединить их в логическую последовательность. Вы можете использовать обещания или новые асинхронные / ожидающие более высокие уровни в качестве инструментов для этой цели, или вы можете откатывать свои собственные.

Но вы не должны использовать какие-либо тактические инструменты для решения проблемы, пока вам не понравится актуальная проблемная область. Нарисуйте карту этих зависимостей, чтобы знать, что нужно запускать, когда. Попытка ad-hoc подхода ко всем этим обратным вызовам просто не поможет вам.

27
задан πάντα ῥεῖ 18 September 2013 в 19:21
поделиться

1 ответ

Но все хорошо работает с другими программами на C, связывающими эту библиотеку.

Вы заметили, что компиляция 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
52
ответ дан πάντα ῥεῖ 5 September 2018 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: