extern "C" (связь C) по умолчанию - PullRequest
2 голосов
/ 05 октября 2010

Вопрос

Поддерживают ли GCC, MSVC или Clang, или некоторую комбинацию, настройку связи по умолчанию на C?

Фон

У меня большой смешанный проект C / C ++, и, хотя экспортировать символы в источниках C ++ с помощью связей C легко и логично, эти же источники предполагают, что все остальное в проекте находится под связью C ++. *

Текущая ситуация требует, чтобы я явно обернул все, что используют источники C, определенные в источниках C ++, и все, что источники C ++ используют из источников C с extern "C++".

В довершение ко всему, я не могу поместить extern "C" во все файлы исходного кода или заголовочные файлы, так как сам материал C ++ будет потом жаловаться. (Например, из #include <memory> или шаблонов, которые я определил.)

Ответы [ 2 ]

7 голосов
/ 05 октября 2010

Стандартный шаблон в заголовочном файле:

#ifdef __cplusplus

// C++ stuff

extern "C" {
#endif

// C/C++ stuff

#ifdef __cplusplus
}
#endif

Я не уверен, что у вас есть другие варианты. Материал C / C ++ должен быть везде объявлен с использованием связи C. Специфичные для C ++ вещи должны быть везде объявлены с помощью C ++.

1 голос
/ 06 октября 2010

Связывание «C» по умолчанию имеет смысл только для источников C, но не для источников C ++ и наоборот.Связь "C" обычно подразумевает, что имена / символы не будут искажены.Связь «C» недостаточно выразительна, чтобы ее можно было использовать для источников C ++, например, для перегруженных функций.

...