2013-08-17 1 views
6

Вопрос в основном о том, что C++ toolchain «понимает» как C, так и C++, поэтому, если я передаю код с extern "C" в C++ toolchain, я предполагаю, что он может понять, что с этим делать; но что, если я подаю код с extern "C++" в C toolchain?Что произойдет, если я использую extern «C++» с инструментальной связкой C?

Каково ожидаемое поведение?

+0

'C' является подмножеством' C++ '... Он не применим наоборот – someone

+0

@ Кришна, и это отправная точка ... что я должен делать с таким кодом, если у меня есть C компилятор? – user2485710

+0

@ someone, не совсем верно, они разные спецификации. Например, я считаю, что C++ не поддерживает назначенные инициализаторы в настоящее время. – Vorac

ответ

7

Если компилятор ТАКЖЕ понимает C++, он может принять его. Если это чистый C компилятор (так же, как это будет на extern "C" как синтаксис не действует C - именно поэтому он обычно прилагается #ifdef __cplusplus или некоторые такие), это будет объект

+0

поэтому компиляция должна остановиться в этом пункте? – user2485710

+1

Это даст ошибку, да. –

+0

Формально он должен выдать диагностику. Это единственное требование. –

4

Он должен не компилировать его недействителен синтаксис C.

Стандартный подход, чтобы сделать объявления C в файле заголовка работать как в компиляторе C, так и на C++, заключается в использовании символа препроцессора, который определен только в компиляторе C++. Например:

#ifdef __cplusplus 
extern "C" { 
#endif 

// C declarations here 
// ... 

#ifdef __cplusplus 
} 
#endif 

Каждый компилятор C++ определяет __cplusplus.

+0

Это правильно, конечно, но я не думаю, что это отвечает на вопрос OP. Я думаю, что он/она неявно спрашивает о вызове кода C++ из единицы перевода C. – idoby

+0

Этот ответ «передает код с extern« C++ »в C toolchain». Честно говоря, это то, что ему нужно. –

2

Если вы написали какой-то другой компилятор с таким вариантом, вы можете это сделать.

Как мы ответили @Mats, у нас есть еще одна процедура для достижения этой цели - #ifdef __cplusplus. Кроме того, что вы пытаетесь сделать, это только ошибка.

4

extern "C++" недействителен C-кодом, поэтому соответствующий компилятор C должен выдать диагностику. Нет требования, чтобы он не скомпилировал код. Выпустив диагностику, компилятор имеет право делать все, что было определено его разработчиком.